Bekerja dengan tarikh dalam R (keupayaan asas, serta pakej pelincir dan timeperiodsR)

Dapatkan tarikh semasa dalam mana-mana bahasa pengaturcaraan, operasi yang setara dengan "Hello world!" Bahasa R tidak terkecuali.

Dalam artikel ini, kita akan melihat cara bekerja dengan tarikh berfungsi dalam sintaks asas bahasa R, dan juga melihat beberapa pakej berguna yang mengembangkan keupayaannya apabila bekerja dengan tarikh:

  • lubridate — pakej yang membolehkan anda melakukan pengiraan aritmetik antara tarikh;
  • timeperiodsR — pakej untuk bekerja dengan selang masa dan komponennya.

Bekerja dengan tarikh dalam R (keupayaan asas, serta pakej pelincir dan timeperiodsR)

Содержание

Jika anda berminat dengan analisis data, dan khususnya bahasa R, anda mungkin berminat dengan saya telegram и youtube saluran. Kebanyakan kandungan didedikasikan untuk bahasa R.

  1. Bekerja dengan tarikh dalam sintaks R asas
    1.1. Tukar teks kepada tarikh
    1.2. Mengeluarkan komponen tarikh dalam asas R
  2. Bekerja dengan kurma menggunakan pakej pelincir
    2.1. Tukar teks kepada tarikh menggunakan pelincir
    2.2. Mengeluar komponen tarikh menggunakan pakej pelincir
    2.3. Operasi aritmetik dengan tarikh
  3. Kerja yang dipermudahkan dengan tempoh, pakej timeperiodsR
    3.1. Selang masa dalam tempoh masaR
    3.2. Menapis vektor tarikh menggunakan tempoh masaR
  4. Kesimpulan

Bekerja dengan tarikh dalam sintaks R asas

Tukar teks kepada tarikh

Basic R mempunyai satu set fungsi untuk bekerja dengan tarikh. Kelemahan sintaks asas ialah kes nama fungsi dan hujah sangat berselerak dan boleh dikatakan tidak mempunyai sambungan logik. Walau bagaimanapun, anda perlu mengetahui fungsi asas bahasa, jadi kami akan mulakan dengannya.

Selalunya apabila memuatkan data ke dalam R, daripada fail csv atau sumber lain, anda menerima tarikh sebagai teks. Untuk menukar teks ini kepada jenis data yang betul, gunakan fungsi as.Date().

# создаём текстовый вектор с датами
my_dates <- c("2019-09-01", "2019-09-10", "2019-09-23")

# проверяем тип данных
class(my_dates)

#> [1] "character"

# преобразуем текст в дату
my_dates <- as.Date(my_dates)

# проверяем тип данных
class(my_dates)

#> [1] "Date"

По умолчанию as.Date() menerima tarikh dalam dua format: YYYY-MM-DD atau YYYY/MM/DD.
Jika set data anda mengandungi tarikh dalam beberapa format lain, anda boleh menggunakan hujah format.

as.Date("September 26, 2019", format = "%B %d, %Y")

format menerima pengendali dalam bentuk rentetan yang menandakan sebarang selang masa dan formatnya; nilai yang paling biasa digunakan ditunjukkan dalam jadual di bawah:

Format
Описание

%d
Nombor hari dalam bulan

%a
Singkatan untuk nama hari dalam seminggu

%A
Nama penuh hari dalam seminggu

%w
Bilangan hari dalam seminggu (0-6, dengan 0 ialah Ahad)

%m
Penetapan bulan dua digit (01-12)

%b
Singkatan nama bulan (apr, mar,…)

%B
Nama penuh bulan

%y
Penetapan tahun dua digit

%Y
Penetapan tahun empat digit

%j
Nombor hari dalam tahun (001 - 366)

%U
Bilangan minggu dalam tahun (00 - 53), permulaan minggu Ahad

%W
Nombor minggu dalam tahun (00 - 53), permulaan minggu Isnin

Sehubungan itu, “26 September 2019” ialah nama penuh bulan, tarikh dan tahun. Format tarikh ini boleh diterangkan menggunakan operator seperti berikut:"%B %d, %Y".

Di mana:

  • %B - Nama penuh bulan
  • %d - Bilangan hari dalam bulan
  • %Y — Penetapan tahun empat digit

Apabila menerangkan format tarikh, adalah penting untuk memasukkan semua aksara tambahan daripada rentetan anda, seperti sempang, koma, noktah, ruang dan sebagainya. Dalam contoh saya, "26 September 2019", terdapat koma selepas tarikh dan anda juga perlu meletakkan koma dalam perihalan format:"%B %d, %Y".

Terdapat situasi apabila anda menerima tarikh yang bukan sahaja tidak sepadan dengan format standard (YYYY-MM-DD atau YYYY/MM/DD), tetapi juga dalam bahasa yang berbeza daripada bahasa lalai yang dipasang pada sistem pengendalian anda. Sebagai contoh, anda memuat turun data yang tarikhnya ditunjukkan seperti ini: "15 Disember 2019." Sebelum menukar rentetan ini kepada tarikh, anda perlu menukar tempat.

# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")

Mengeluarkan komponen tarikh dalam asas R

Tidak banyak fungsi dalam R asas yang membolehkan anda mengekstrak mana-mana bahagian tarikh daripada objek kelas Tarikh.

current_date <- Sys.Date() # текущая дата
weekdays(current_date)     # получить номер дня недели
months(current_date)       # получить номер месяца в году
quarters(current_date)     # получить номер квартала в году

Sebagai tambahan kepada kelas objek utama Tarikh dalam R asas terdapat 2 lagi jenis data yang menyimpan cap masa: POSIXlt, POSIXct. Perbezaan utama antara kelas ini dan Tarikh ialah sebagai tambahan kepada tarikh mereka menyimpan masa.

# получить текущую дату и время
current_time <- Sys.time()

# узнать класс объекта current_time 
class(current_time)

# "POSIXct" "POSIXt"

Fungsi Sys.time() mengembalikan tarikh dan masa semasa dalam format POSIXct. Format ini serupa dengan maksud UNIXTIME, dan menyimpan bilangan saat sejak permulaan era UNIX (tengah malam (UTC) dari 31 Disember 1969 hingga 1 Januari 1970).

Kelas POSIXlt ia juga menyimpan masa dan tarikh, dan semua komponennya. Oleh itu, ia adalah objek dengan struktur yang lebih kompleks, tetapi dari mana ia adalah mudah untuk mendapatkan mana-mana komponen tarikh dan masa kerana sebenarnya POSIXlt это senarai.

# Получаем текущую дату и время
current_time_ct <- Sys.time()

# Преобразуем в формат POSIXlt
current_time_lt <- as.POSIXlt(current_time_ct)

# извлекаем компоненты даты и времени
current_time_lt$sec   # секунды
current_time_lt$min   # минуты
current_time_lt$hour  # часы
current_time_lt$mday  # день месяца
current_time_lt$mon   # месяц
current_time_lt$year  # год
current_time_lt$wday  # день недели
current_time_lt$yday  # день года
current_time_lt$zone  # часовой пояс

Menukar data angka dan teks kepada format POSIX* dijalankan oleh fungsi as.POSIXct() и as.POSIXlt(). Fungsi ini mempunyai set hujah yang kecil.

  • x — Nombor, rentetan atau objek kelas Tarikh, yang perlu ditukar;
  • tz — Zon waktu, lalai "GMT";
  • format — Perihalan format tarikh di mana data yang dihantar ke argumen x diwakili;
  • asal — Digunakan hanya apabila menukar nombor kepada POSIX; anda mesti lulus objek tarikh dan masa dari mana detik dikira kepada hujah ini. Biasanya digunakan untuk terjemahan daripada UNIXTIME.

Jika maklumat tarikh dan masa anda ada UNIXTIME, kemudian untuk menukarnya kepada tarikh yang jelas dan boleh dibaca, gunakan contoh berikut:

# Конвертируем UNIXTIME в читаемую дату 
as.POSIXlt(1570084639,  origin = "1970-01-01")

Dalam asal anda boleh menentukan sebarang cap masa. Contohnya, jika data anda mengandungi tarikh dan masa sebagai bilangan saat sejak 15 September 2019 12:15 tengahari, maka untuk menukarnya kepada penggunaan tarikh:

# Конвертируем UNIXTIME в дату учитывая что начало отсчёта 15 сентября 2019 12:15
as.POSIXlt(1546123,  origin = "2019-09-15 12:15:00")

Bekerja dengan kurma menggunakan pakej pelincir

lubridate Mungkin pakej paling popular untuk bekerja dengan tarikh dalam bahasa R. Ia menyediakan anda dengan tiga kelas tambahan.

  • tempoh - tempoh, i.e. bilangan saat antara dua cap masa;
  • tempoh - tempoh membolehkan anda membuat pengiraan antara tarikh dalam selang yang boleh dibaca manusia: hari, bulan, minggu dan seterusnya;
  • selang - objek yang menyediakan titik permulaan dan penamat dalam masa.

Pemasangan pakej tambahan dalam bahasa R dijalankan menggunakan fungsi standard install.packages().

Memasang pakej lubridate:

install.packages("lubridate")

Tukar teks kepada tarikh menggunakan pelincir

Ciri pakej lubridate memudahkan proses menukar teks kepada tarikh, dan juga membolehkan anda menjalankan sebarang operasi aritmetik dengan tarikh dan masa.

Fungsi ini akan membantu anda mendapatkan tarikh atau tarikh dan masa semasa today() и now().

today() # текущая дата
now()   # текущая дата и время

Untuk menukar rentetan kepada tarikh masuk lubridate Terdapat seluruh keluarga fungsi yang namanya sentiasa terdiri daripada tiga huruf, dan menunjukkan urutan komponen tarikh:

  • y - tahun
  • m - bulan
  • d - hari

Senarai fungsi untuk menukar teks kepada tarikh melalui pelincir

  • ymd()
  • ydm()
  • mdy()
  • myd()
  • dmy()
  • dym()
  • yq()

Beberapa contoh untuk menukar rentetan kepada tarikh:

ymd("2017 jan 21")
mdy("March 20th, 2019")
dmy("1st april of 2018")

Seperti yang anda boleh lihat lubridate Ia jauh lebih cekap dalam mengenali perihalan tarikh sebagai teks, dan membolehkan anda menukar teks kepada tarikh tanpa menggunakan operator tambahan untuk menerangkan format.

Mengeluar komponen tarikh menggunakan pakej pelincir

Juga menggunakan lubridate anda boleh mendapatkan mana-mana komponen dari tarikh:

dt <- ymd("2017 jan 21")

year(dt)  # год
month(dt) # месяц
mday(dt)  # день в месяце
yday(dt)  # день в году
wday(dt)  # день недели

Operasi aritmetik dengan tarikh

Tetapi fungsi yang paling penting dan asas lubridate ialah keupayaan untuk melakukan pelbagai operasi aritmetik dengan tarikh.

Pembundaran tarikh dilakukan oleh tiga fungsi:

  • floor_date — membundarkan kepada kala lampau terdekat
  • ceiling_date — membundarkan kepada tegang masa terdekat
  • round_date - membundarkan kepada masa terdekat

Setiap fungsi ini mempunyai hujah unityang membolehkan anda menentukan unit pembundaran: saat, minit, jam, hari, minggu, bulan, dwibulan, suku, musim, setengah tahun, tahun

dt <- ymd("2017 jan 21")

round_date(dt, unit = "month")    # округлить до месяца
round_date(dt, unit = "3 month")  # округлить до 3 месяцев
round_date(dt, unit = "quarter")  # округлить до квартала
round_date(dt, unit = "season")   # округлить до сезона
round_date(dt, unit = "halfyear") # округлить до полугодия

Jadi mari kita fikirkan bagaimana untuk mendapatkan tarikh yang 8 hari selepas tarikh semasa dan melakukan pelbagai pengiraan aritmetik lain antara kedua-dua tarikh tersebut.

today() + days(8)   # какая дата будет через 8 дней
today() - months(2) # какая дата была 2 месяца назад
today() + weeks(12) # какая дата будет через 12 недель
today() - years(2)  # какая дата была 2 года назад

Kerja yang dipermudahkan dengan tempoh, pakej timeperiodsR.

timeperiodsR — pakej baharu untuk bekerja dengan tarikh yang diterbitkan di CRAN pada September 2019.

Memasang pakej timeperiodsR:

install.packages("timeperiodsR")

Tujuan utama adalah untuk menentukan selang masa tertentu dengan cepat berbanding tarikh tertentu. Sebagai contoh, menggunakan fungsinya, anda boleh dengan mudah:

  • Dapatkan minggu, bulan, suku atau tahun yang lalu dalam R.
  • Dapatkan bilangan selang masa yang ditentukan berbanding tarikh, contohnya 4 minggu yang lalu.
  • Mudah untuk mengekstrak komponennya daripada selang masa yang terhasil: tarikh mula dan tamat, bilangan hari yang dimasukkan dalam selang, keseluruhan urutan tarikh yang disertakan di dalamnya.

Nama semua fungsi pakej timeperiodsR adalah intuitif dan terdiri daripada dua bahagian: arah_selang waktu, di mana:

  • arah di mana anda perlu bergerak relatif kepada tarikh tertentu: last_n, previous, this, next, next_n.
  • temporal selang waktu untuk mengira tempoh: hari, minggu, bulan, suku tahun, tahun.

Set penuh fungsi:

  • last_n_days()
  • last_n_weeks()
  • last_n_months()
  • last_n_quarters()
  • last_n_years()
  • previous_week()
  • previous_month()
  • previous_quarter()
  • previous_year()
  • this_week()
  • this_month()
  • this_quarter()
  • this_year()
  • next_week()
  • next_month()
  • next_quarter()
  • next_year()
  • next_n_days()
  • next_n_weeks()
  • next_n_months()
  • next_n_quarters()
  • next_n_years()
  • custom_period()

Selang masa dalam tempoh masaR

Fungsi ini berguna dalam kes di mana anda perlu membina laporan berdasarkan data dari minggu atau bulan lalu. Untuk mendapatkan bulan lepas, gunakan fungsi dengan nama yang sama previous_month():

prmonth <- previous_month()

Selepas itu anda akan mempunyai objek prmonth kelas tpr, yang mana komponen berikut boleh diperolehi dengan mudah:

  • tarikh mula tempoh, dalam contoh kami ini adalah bulan terakhir
  • tarikh tamat tempoh
  • bilangan hari yang termasuk dalam tempoh tersebut
  • urutan tarikh yang dimasukkan dalam tempoh tersebut

Selain itu, anda boleh mendapatkan setiap komponen dengan cara yang berbeza:

# первый день периода
prmonth$start
start(prmonth)

# последний день периода
prmonth$end
end(prmonth)

# последовательность дат
prmonth$sequence
seq(prmonth)

# количество дней входящих в период
prmonth$length
length(prmonth)

Anda juga boleh mendapatkan mana-mana komponen menggunakan hujah sebahagian, yang terdapat dalam setiap fungsi pakej. Nilai yang mungkin: mula, tamat, urutan, panjang.

previous_month(part = "start")    # начало периода
previous_month(part = "end")      # конец периода
previous_month(part = "sequence") # последовательность дат
previous_month(part = "length")   # количество дней в периоде

Jadi mari kita lihat semua hujah yang tersedia dalam fungsi pakej timeperiodsR:

  • x — Tarikh rujukan dari mana tempoh masa akan dikira, tarikh semasa secara lalai;
  • n — Bilangan selang yang akan dimasukkan dalam tempoh, contohnya 3 minggu sebelumnya;
  • part - Komponen objek yang manakah tpr anda perlu dapatkan, secara lalai all;
  • week_start — Hujah hadir hanya dalam fungsi untuk bekerja dengan minggu, dan membolehkan anda menetapkan nombor hari dalam minggu yang akan dianggap permulaannya. Secara lalai, permulaan minggu ialah hari Isnin, tetapi anda boleh menetapkan mana-mana daripada 1 - Isnin hingga 7 - Ahad.

Oleh itu, anda boleh mengira sebarang tempoh masa berbanding dengan tarikh semasa atau mana-mana tarikh lain; berikut ialah beberapa lagi contoh:

# получить 3 прошлые недели
# от 6 октября 2019 года
# начало недели - понедельник
last_n_weeks(x = "2019-10-06", 
             n = 3, 
             week_start = 1)

 Time period: from  9 September of 2019, Monday to 29 September of 2019, Sunday

6 Oktober adalah hari Ahad:
Bekerja dengan tarikh dalam R (keupayaan asas, serta pakej pelincir dan timeperiodsR)

Kami memerlukan tempoh yang, berbanding 6 Oktober, akan mengambil masa 3 minggu sebelumnya. Tidak termasuk minggu yang merangkumi 6 Oktober itu sendiri. Sehubungan itu, ini adalah tempoh dari 9 September hingga 29 September.

Bekerja dengan tarikh dalam R (keupayaan asas, serta pakej pelincir dan timeperiodsR)

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4)

 Time period: from  1 May of 2019, Wednesday to 31 May of 2019, Friday

Dalam contoh ini, kami berminat dengan bulan yang 4 bulan lalu, jika kami bermula dari 16 September 2019, maka itu adalah Mei 2019.

Menapis vektor tarikh menggunakan tempoh masaR

Untuk menapis tarikh dalam timeperiodsR Terdapat beberapa operator:

  • %left_out% - membandingkan dua objek kelas tpr, dan mengembalikan nilai dari kiri yang tiada di kanan.
  • %left_in% - membandingkan dua objek kelas tpr, dan mengembalikan tarikh dari objek kiri yang disertakan dalam objek kanan.
  • %right_out% - membandingkan dua objek kelas tpr, dan mengembalikan nilai dari yang kanan yang hilang dari yang kiri.
  • %right_in% - membandingkan dua objek kelas tpr, dan mengembalikan tarikh dari objek kanan yang terdapat di sebelah kiri.

period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")

period1 %left_in% period2   # получить даты из period1 которые входят в period2
period1 %left_out% period2  # получить даты из period1 которые не входят в period2
period1 %right_in% period2  # получить даты из period2 которые входят в period1
period1 %right_out% period2 # получить даты из period2 которые не входят в period1

Pada pakej timeperiodsR ada yang rasmi, berbahasa Rusia senarai main YouTube.

Kesimpulan

Kami memeriksa secara terperinci kelas objek yang direka dalam bahasa R untuk bekerja dengan tarikh. Juga kini anda boleh melakukan operasi aritmetik pada tarikh, dan dengan cepat mendapatkan sebarang tempoh masa menggunakan pakej timeperiodsR.

Jika anda berminat dengan bahasa R, saya menjemput anda untuk melanggan saluran telegram saya R4pemasaran, di mana saya berkongsi bahan berguna setiap hari tentang penggunaan bahasa R dalam menyelesaikan masalah harian anda.

Sumber: www.habr.com

Tambah komen