Työskentely päivämäärien kanssa R:ssä (perusominaisuudet sekä voitelu- ja timeperiodsR-paketit)

Hanki nykyinen päivämäärä millä tahansa ohjelmointikielellä, mikä vastaa "Hei maailma!" R-kieli ei ole poikkeus.

Tässä artikkelissa tarkastellaan, kuinka päivämäärien kanssa työskentely toimii R-kielen perussyntaksissa, ja tarkastellaan myös useita hyödyllisiä paketteja, jotka laajentavat sen ominaisuuksia päivämäärien kanssa työskennellessä:

  • lubridate — paketti, jonka avulla voit suorittaa aritmeettisia laskelmia päivämäärien välillä;
  • timeperiodsR — paketti työskentelyyn aikaväleillä ja niiden komponenteilla.

Työskentely päivämäärien kanssa R:ssä (perusominaisuudet sekä voitelu- ja timeperiodsR-paketit)

Pitoisuus

Jos olet kiinnostunut data-analyysistä ja erityisesti R-kielestä, saatat olla kiinnostunut minun sähke и youtube kanavia. Suurin osa sisällöstä on omistettu R-kielelle.

  1. Työskentely päivämäärien kanssa R-perussyntaksissa
    1.1. Muunna teksti päivämääräksi
    1.2. Päivämääräkomponenttien purkaminen perus-R:ssä
  2. Työskentely päivämäärien kanssa voiteluainepaketin avulla
    2.1. Muunna teksti päivämääräksi voiteluaineen avulla
    2.2. Päiväyskomponenttien poistaminen voitelupakkauksen avulla
    2.3. Aritmeettiset operaatiot päivämäärillä
  3. Yksinkertaistettu työ jaksoilla, timeperiodsR-paketti
    3.1. Aikavälit aikajaksoissaR
    3.2. Päivämäärävektorin suodattaminen käyttämällä aikajaksojaR
  4. Johtopäätös

Työskentely päivämäärien kanssa R-perussyntaksissa

Muunna teksti päivämääräksi

Basic R:ssä on joukko toimintoja päivämäärien käsittelyä varten. Perussyntaksin haittana on, että funktioiden nimien ja argumenttien tapaus on hyvin hajallaan eikä sillä ole käytännössä mitään loogista yhteyttä. Sinun on kuitenkin tiedettävä kielen perustoiminnot, joten aloitamme niistä.

Useimmiten, kun lataat tietoja R-kirjaimeen, csv-tiedostoista tai muista lähteistä, saat päivämäärän tekstinä. Jos haluat muuntaa tämän tekstin oikeaan tietotyyppiin, käytä funktiota 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"

Oletuksena as.Date() hyväksyy päivämäärän kahdessa muodossa: VVVV-KK-PP tai VVVV/KK/PP.
Jos tietojoukossasi on päivämäärät jossain muussa muodossa, voit käyttää argumenttia format.

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

muoto hyväksyy operaattorit merkkijonomuodossa, jotka ilmaisevat mitä tahansa aikaväliä ja sen muotoa; yleisimmin käytetyt arvot on esitetty alla olevassa taulukossa:

Formaatti
Kuvaus

%d
Päivän numero kuukaudessa

%a
Lyhenne viikonpäivän nimestä

%A
Viikonpäivän koko nimi

%w
Viikonpäivän numero (0-6, missä 0 on sunnuntai)

%m
Kaksinumeroinen kuukausimerkintä (01-12)

%b
Kuukauden nimen lyhenne (huhtikuu, maaliskuu, …)

%B
Koko kuukauden nimi

%y
Kaksinumeroinen vuosimerkintä

%Y
Nelinumeroinen vuosimerkintä

%j
Päivän numero vuonna (001 - 366)

%U
Viikon numero vuonna (00 - 53), viikon alku sunnuntai

%W
Viikon numero vuonna (00 - 53), viikon alku maanantai

Vastaavasti "26. syyskuuta 2019" on kuukauden, päivämäärän ja vuoden koko nimi. Tämä päivämäärämuoto voidaan kuvata operaattorien avulla seuraavasti:"%B %d, %Y".

Missä:

  • %B — Kuukauden koko nimi
  • %d — Päivän numero kuukaudessa
  • %Y — Nelinumeroinen vuosiluku

Kun kuvailet päivämäärämuotoa, on tärkeää sisällyttää kaikki lisämerkit merkkijonosta, kuten väliviivat, pilkut, pisteet, välilyönnit ja niin edelleen. Esimerkissäni "26. syyskuuta 2019" on pilkku päivämäärän jälkeen, ja muodon kuvaukseen on myös lisättävä pilkku:"%B %d, %Y".

On tilanteita, joissa saat päivämäärän, joka ei vain vastaa vakiomuotoja (VVVV-KK-PP tai VVVV/KK/PP), mutta myös kielellä, joka poikkeaa käyttöjärjestelmääsi asennetusta oletuskielestä. Latasit esimerkiksi dataa, jossa päivämäärä on merkitty seuraavasti: "15. joulukuuta 2019". Ennen kuin muutat tämän merkkijonon päivämääräksi, sinun on vaihdettava maa-asetus.

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

Päivämääräkomponenttien purkaminen perus-R:ssä

Perus R:ssä ei ole monia toimintoja, joiden avulla voit poimia minkä tahansa osan päivämäärästä luokkaobjektista Päivämäärä.

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

Pääobjektiluokan lisäksi Päivämäärä perus R:ssä on kaksi muuta tietotyyppiä, jotka tallentavat aikaleiman: POSIXlt, POSIXct. Suurin ero näiden luokkien ja Päivämäärä on se, että päivämäärän lisäksi ne tallentavat kellonajan.

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

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

# "POSIXct" "POSIXt"

Toiminto Sys.time() palauttaa nykyisen päivämäärän ja kellonajan muodossa POSIXct. Tämä muoto on merkitykseltään samanlainen UNIXTIME, ja tallentaa sekuntien määrän UNIX-aikakauden alusta (keskiyö (UTC) 31. joulukuuta 1969 - 1. tammikuuta 1970).

Luokka POSIXlt se tallentaa myös kellonajan ja päivämäärän sekä kaikki niiden komponentit. Siksi se on objekti, jolla on monimutkaisempi rakenne, mutta josta on helppo saada mikä tahansa päivämäärä- ja aikakomponentti, koska itse asiassa POSIXlt это lista.

# Получаем текущую дату и время
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  # часовой пояс

Numeerisen ja tekstidatan muuntaminen muotoihin POSIX* toimintojen suorittama as.POSIXct() и as.POSIXlt(). Näillä funktioilla on pieni joukko argumentteja.

  • x — Numero, merkkijono tai luokkaobjekti Päivämäärä, joka on muutettava;
  • tz — Aikavyöhyke, oletusarvo "GMT";
  • muoto — Kuvaus päivämäärämuodosta, jossa x-argumentille välitetyt tiedot esitetään;
  • origin — Käytetään vain muunnettaessa numero POSIX-muotoon; sinun on välitettävä päivämääräobjekti ja aika, joista sekunnit lasketaan tähän argumenttiin. Yleensä käytetään kääntämiseen UNIXTIMEsta.

Jos päivämäärä- ja aikatietosi ovat mukana UNIXTIME, ja muuntaa ne selkeäksi, luettavaksi päivämääräksi käyttämällä seuraavaa esimerkkiä:

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

Alkuperässä voit määrittää minkä tahansa aikaleiman. Jos tietosi sisältävät esimerkiksi päivämäärän ja kellonajan sekuntien lukumääränä 15. syyskuuta 2019 klo 12 jälkeen, voit muuntaa ne päivämääräksi seuraavasti:

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

Työskentely päivämäärien kanssa voiteluainepaketin avulla

lubridate Ehkä suosituin R-kielen päivämäärien käsittelyyn tarkoitettu paketti, joka tarjoaa kolme lisäluokkaa.

  • kestoajat — kesto, ts. kahden aikaleiman välinen sekuntimäärä;
  • jaksot - jaksojen avulla voit tehdä laskelmia päivämäärien välillä ihmisen luettavissa aikavälein: päivät, kuukaudet, viikot ja niin edelleen;
  • intervallit - objektit, jotka tarjoavat aloitus- ja lopetuspisteen.

Lisäpakettien asennus R-kielellä suoritetaan vakiotoiminnolla install.packages().

Paketin asentaminen lubridate:

install.packages("lubridate")

Muunna teksti päivämääräksi voiteluaineen avulla

Paketin ominaisuudet lubridate yksinkertaistaa huomattavasti tekstin muuntamista päivämääräksi ja mahdollistaa myös aritmeettisten toimintojen suorittamisen päivämäärien ja kellonaikojen kanssa.

Toiminnot auttavat sinua saamaan nykyisen päivämäärän tai päivämäärän ja kellonajan today() и now().

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

Merkkijonon muuntaminen päivämääräksi lubridate On olemassa koko perhe funktioita, joiden nimet koostuvat aina kolmesta kirjaimesta ja osoittavat päivämääräkomponenttien järjestyksen:

  • y - vuosi
  • m - kuukausi
  • d - päivä

Luettelo toiminnoista tekstin muuntamiseksi päivämääräksi voitelutoiminnon avulla

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

Esimerkkejä merkkijonojen muuntamisesta päivämääriksi:

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

Kuten näet lubridate Se tunnistaa päivämääräkuvaukset tekstiksi paljon tehokkaammin, ja sen avulla voit muuntaa tekstin päivämääräksi ilman lisäoperaattoreita muodon kuvaamiseen.

Päiväyskomponenttien poistaminen voitelupakkauksen avulla

Myös käytössä lubridate voit saada minkä tahansa komponentin päivämäärästä:

dt <- ymd("2017 jan 21")

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

Aritmeettiset operaatiot päivämäärillä

Mutta tärkein ja perustoiminto lubridate on kyky suorittaa erilaisia ​​aritmeettisia operaatioita päivämäärillä.

Päivämäärän pyöristys suoritetaan kolmella toiminnolla:

  • floor_date — pyöristäminen lähimpään menneisyyteen
  • ceiling_date — pyöristys lähitulevaisuuteen
  • round_date - pyöristys lähimpään aikaan

Jokaisella näistä funktioista on argumentti yksikköjonka avulla voit määrittää pyöristysyksikön: sekunti, minuutti, tunti, päivä, viikko, kuukausi, kaksikuukausi, neljännes, kausi, puolivuosi, vuosi

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") # округлить до полугодия

Joten selvitetään kuinka saada päivämäärä, joka on 8 päivää nykyisen päivämäärän jälkeen, ja tehdä useita muita aritmeettisia laskelmia näiden kahden päivämäärän välillä.

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

Yksinkertaistettu työ jaksoilla, timeperiodsR-paketti.

timeperiodsR - uusi paketti päivämäärien kanssa työskentelemiseen, joka julkaistiin CRANissa syyskuussa 2019.

Paketin asentaminen timeperiodsR:

install.packages("timeperiodsR")

Päätarkoituksena on määrittää nopeasti tietty aikaväli tiettyyn päivämäärään nähden. Esimerkiksi sen toimintojen avulla voit helposti:

  • Hae viimeinen viikko, kuukausi, vuosineljännes tai vuosi R-muodossa.
  • Hanki tietty määrä aikavälejä suhteessa päivämäärään, esimerkiksi viimeiset 4 viikkoa.
  • Sen osat on helppo poimia tuloksena olevasta aikavälistä: aloitus- ja lopetuspäivämäärä, väliin sisältyvien päivien lukumäärä, koko siihen sisältyvä päivämääräsarja.

Kaikkien pakettitoimintojen nimi timeperiodsR ovat intuitiivisia ja koostuvat kahdesta osasta: suunta_aikaväli, jossa:

  • suunta jossa sinun on siirryttävä suhteessa tiettyyn päivämäärään: viimeinen_n, edellinen, tämä, seuraava, seuraava_n.
  • tilapäinen aikaväli laskea ajanjakso: päivä, viikko, kuukausi, vuosineljännes, vuosi.

Täysi ominaisuussarja:

  • 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()

Aikavälit aikajaksoissaR

Nämä toiminnot ovat hyödyllisiä tapauksissa, joissa sinun on laadittava raportteja kuluneen viikon tai kuukauden tietojen perusteella. Käytä samannimistä toimintoa saadaksesi viimeisen kuukauden previous_month():

prmonth <- previous_month()

Sen jälkeen sinulla on esine prmonth luokka TPR, josta seuraavat komponentit voidaan saada helposti:

  • kauden alkamispäivä, esimerkissämme tämä on viimeinen kuukausi
  • kauden päättymispäivä
  • ajanjaksoon sisältyvien päivien lukumäärä
  • ajanjaksoon sisältyvien päivämäärien sarja

Lisäksi voit hankkia jokaisen komponentin eri tavoilla:

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

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

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

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

Voit myös saada minkä tahansa komponentin argumentin avulla osa, joka on mukana jokaisessa paketin toiminnossa. Mahdolliset arvot: alku, loppu, järjestys, pituus.

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

Katsotaanpa siis kaikkia pakettifunktioissa saatavilla olevia argumentteja timeperiodsR:

  • x — Viitepäivämäärä, josta ajanjakso lasketaan, oletusarvoisesti nykyinen päivämäärä;
  • n — ajanjaksoon sisällytettävien välien lukumäärä, esimerkiksi viimeiset 3 viikkoa;
  • part — Mikä kohteen komponentti tpr sinun on hankittava oletuksena all;
  • week_start — Argumentti esiintyy vain viikkojen kanssa työskentelyyn tarkoitetuissa funktioissa, ja sen avulla voit asettaa sen viikonpäivän numeron, jonka katsotaan alkavan. Oletusarvoisesti viikon alku on maanantai, mutta voit asettaa minkä tahansa 1 - maanantaista 7 - sunnuntaihin.

Voit siis laskea minkä tahansa ajanjakson suhteessa nykyiseen tai mihin tahansa muuhun tiettyyn päivämäärään; tässä on muutama esimerkki lisää:

# получить 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. lokakuuta on sunnuntai:
Työskentely päivämäärien kanssa R:ssä (perusominaisuudet sekä voitelu- ja timeperiodsR-paketit)

Tarvitsemme ajanjakson, joka lokakuun 6. päivään verrattuna kestää 3 edellistä viikkoa. Ei sisällä viikko, joka sisältää itse lokakuun 6. päivän. Näin ollen tämä on ajanjakso 9.–29.

Työskentely päivämäärien kanssa R:ssä (perusominaisuudet sekä voitelu- ja timeperiodsR-paketit)

# получить месяц отстающий на 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

Tässä esimerkissä olemme kiinnostuneita kuukaudesta, joka oli 4 kuukautta sitten, jos aloitamme 16, niin se oli toukokuu 2019.

Päivämäärävektorin suodattaminen käyttämällä aikajaksojaR

Suodattaaksesi päivämäärät timeperiodsR Operaattoreita on useita:

  • %left_out% - vertaa kahta tpr-luokan objektia ja palauttaa arvon vasemmasta, joka puuttuu oikeasta.
  • %left_in% - vertaa kahta tpr-luokan objektia ja palauttaa vasemman objektin päivämäärät, jotka sisältyvät oikeaan.
  • %right_out% - vertaa kahta tpr-luokan objektia ja palauttaa oikean arvon, joka puuttuu vasemmasta.
  • %right_in% - vertaa kahta tpr-luokan objektia ja palauttaa oikeasta objektista päivämäärät, jotka ovat vasemmassa.

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

Paketissa timeperiodsR siellä on virallinen, venäjänkielinen YouTube-soittolista.

Johtopäätös

Tutkimme yksityiskohtaisesti objektiluokat, jotka on suunniteltu R-kielellä päivämäärien kanssa työskentelemiseen. Nyt voit myös suorittaa aritmeettisia operaatioita päivämäärillä ja saada nopeasti mitkä tahansa aikajaksot paketin avulla timeperiodsR.

Jos olet kiinnostunut R-kielestä, kutsun sinut tilaamaan sähkekanavani R4-markkinointi, jossa jaan päivittäin hyödyllistä materiaalia R-kielen käytöstä päivittäisten ongelmien ratkaisemisessa.

Lähde: will.com

Lisää kommentti