R послідовність дат із мастилом


76

Привіт, я намагаюся отримати послідовність дат із мастилом

Це не працює

seq(ymd('2012-04-07'),ymd('2013-03-22'),by=week(1))

основна команда

seq(as.Date('2012-04-7'),as.Date('2013-03-22'),'weeks')

робить, але я хотів би знати, чи є елегантний спосіб зробити це за допомогою мастила.

РЕДАГУВАТИ

Будь ласка, ігноруйте: я вирішив себе, тому залишився лише для нащадків. Ми раді видалити це за потреби.

seq(ymd('2012-04-07'),ymd('2013-03-22'),by='weeks')

Робить фокус


дякую @shujaa mnel потрапив туди з корисним та докладним поясненням.
Тахнун-паша

Відповіді:


87

ymdє обгорткою для синтаксичного аналізу рядків дати і повертає POSIXctоб'єкт.

Вам просто потрібно використовувати стандартну термінологію, описану в ?seq.POSIXt(не lubridate), щоб визначити тижні

seq(ymd('2012-04-07'),ymd('2013-03-22'), by = '1 week')
seq(ymd('2012-04-07'),ymd('2013-03-22'), by = 'weeks')

воля працює

як буде

seq(ymd('2012-04-07'),ymd('2013-03-22'), by = '2 week')

Ви можете примусити lubridate Periodоб’єкт класу до a difftime, але це здається досить непотрібним

seq(ymd('2012-04-07'),ymd('2013-03-22'), by = as.difftime(weeks(1)))

Чи є спосіб отримати послідовність POSIXctвідформатованих об’єктів? Я хочу використовувати мою послідовність дат для власної осі х, і POSIXtне збігається з даними графіку (це все POSIXct з результату змащення).
rrr

Застереження, що підхід базового R не завжди виконує те саме, що і Період мастила. seq(as.Date("2001-01-31"), as.Date("2001-12-31"), "months")дає дивовижні результати, наприклад.
dash2

6

Це спосіб триматися в межах POSIXctвсесвіту , lubridateа не дата зміни форматів на базову R - х POSIXt. Я уникаю зміни формату дати у своїх сценаріях, оскільки вважаю, що це загальне місце, де вводяться помилки (наприклад, зміна часового поясу або втрата часових позначок). Відповідно до цієї поради слід користуватися %m+%: R: додавання 1 місяця до дати

# example date is a leap day for a "worst case scenario"
library("lubridate")
posixct.in <- parse_date_time(x = "2016-02-29", orders = "ymd")
# [1] "2016-02-29 UTC"

posixct.seq <- posixct.in %m+% years(x = seq.int(from = 0, to = 3, by = 1))
# [1] "2016-02-29 UTC" "2017-02-28 UTC" "2018-02-28 UTC" "2019-02-28 UTC"

posixct.seq <- posixct.in %m+% months(x = seq.int(from = 0, to = 3, by = 1))
# [1] "2016-02-29 UTC" "2016-03-29 UTC" "2016-04-29 UTC" "2016-05-29 UTC"

posixct.seq <- posixct.in %m+% days(x = seq.int(from = 0, to = 3, by = 1))
# [1] "2016-02-29 UTC" "2016-03-01 UTC" "2016-03-02 UTC" "2016-03-03 UTC"

posixct.seq <- posixct.in %m+% weeks(x = seq.int(from = 0, to = 3, by = 1))
# [1] "2016-02-29 UTC" "2016-03-07 UTC" "2016-03-14 UTC" "2016-03-21 UTC"

Звичайний +також іноді працює, але %m+%запобігає таким помилкам:

posixct.seq <- posixct.in + years(x = seq.int(from = 0, to = 3, by = 1))
# [1] "2016-02-29 UTC" NA               NA               NA

Спочатку я був розгублений, тому що думав, що %m+це просто спосіб додати місяці, і подібних lubridateкоманд, таких як %y+%тощо, не існує. Але, виявляється, "m" не означає "додавання місяця". Моє найкраще здогадування - "магія" =)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.