Генерация последовательности последнего дня месяца за два года - PullRequest
37 голосов
/ 01 декабря 2011

Я использую lubridate и решил, что это будет так просто

ymd("2010-01-31")+months(0:23)

Но посмотри, что получишь. Это все запутано!

 [1] "2010-01-31 UTC" "2010-03-03 UTC" "2010-03-31 UTC" "2010-05-01 UTC" "2010-05-31 UTC" "2010-07-01 UTC" "2010-07-31 UTC" "2010-08-31 UTC" "2010-10-01 UTC"
[10] "2010-10-31 UTC" "2010-12-01 UTC" "2010-12-31 UTC" "2011-01-31 UTC" "2011-03-03 UTC" "2011-03-31 UTC" "2011-05-01 UTC" "2011-05-31 UTC" "2011-07-01 UTC"
[19] "2011-07-31 UTC" "2011-08-31 UTC" "2011-10-01 UTC" "2011-10-31 UTC" "2011-12-01 UTC" "2011-12-31 UTC"

Затем я прочитал, как lubridate обслуживает такие явления, как интервал, продолжительность и период. Итак, хорошо, я понимаю, что месяц - это количество дней, определенное как (365 * 4 + 1) / 48 = 30,438 дней Поэтому я попытался стать умным и переписать его как

ymd("2010-01-31")+ as.period(months(0:23))

Но это только что дало ошибку.

Error in as.period.default(months(0:23)) : 
  (list) object cannot be coerced to type 'double'

Ответы [ 2 ]

82 голосов
/ 01 декабря 2011

Да, вы нашли правильный трюк: возвращаясь на день с первого числа в следующем месяце .

Вот как одна строка в базе R:

R> seq(as.Date("2010-02-01"), length=24, by="1 month") - 1
 [1] "2010-01-31" "2010-02-28" "2010-03-31" "2010-04-30" "2010-05-31"
 [6] "2010-06-30" "2010-07-31" "2010-08-31" "2010-09-30" "2010-10-31"
[11] "2010-11-30" "2010-12-31" "2011-01-31" "2011-02-28" "2011-03-31"
[16] "2011-04-30" "2011-05-31" "2011-06-30" "2011-07-31" "2011-08-31"
[21] "2011-09-30" "2011-10-31" "2011-11-30" "2011-12-31"
R> 

Так что нет необходимости в lubridate , который (хотя и является хорошим пакетом) не нужен для такой простой задачи, как эта.Плюс, его перегрузка существующих базовых функций все еще кажется мне несколько опасной ...

13 голосов
/ 01 декабря 2011

Удивительно, как печать вопроса фокусирует творческую энергию.Я думаю, что я разработал ответ.Я также могу опубликовать это здесь для следующей бедной души, которая теряет время.

ymd("2010-02-01")+ months(0:23)-days(1)

Просто укажите первый день следующего месяца и сгенерируйте последовательность из этого, но вычтите 1 день из него, чтобы получитьпоследний день предыдущего месяца.

[1] "2010-01-31 UTC" "2010-02-28 UTC" "2010-03-31 UTC" "2010-04-30 UTC" "2010-05-31 UTC" "2010-06-30 UTC" "2010-07-31 UTC" "2010-08-31 UTC" "2010-09-30 UTC"
[10] "2010-10-31 UTC" "2010-11-30 UTC" "2010-12-31 UTC" "2011-01-31 UTC" "2011-02-28 UTC" "2011-03-31 UTC" "2011-04-30 UTC" "2011-05-31 UTC" "2011-06-30 UTC"
[19] "2011-07-31 UTC" "2011-08-31 UTC" "2011-09-30 UTC" "2011-10-31 UTC" "2011-11-30 UTC" "2011-12-31 UTC"

Кстати, как мне избавиться от надоедливых обозначений "UTC".Часовые пояса спасают жизнь, когда они необходимы.В остальное время они неприятны.

...