43

I use lubridate and figured that this would be so easy

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

But look what one gets. It is all messed up!

 [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"

Then I read how lubridate caters to phenomenon such as interval, duration and period. So, OK I realize that a month is actually the number of days defined by (365*4+1)/48 = 30.438 days. So I tried to get smart and rewrite it as

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

But that just gave an error.

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

2 に答える 2

97

はい、あなたは正しいトリックを見つけました:翌月の最初から 1 日さかのぼります。

これはベース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> 

したがって、このような単純なタスクには必要のない潤滑油は必要ありません (優れたパッケージですが)。さらに、既存の基本機能のオーバーロードは、依然としてやや危険だと思います...

于 2011-11-30T23:29:45.643 に答える
20

質問を入力すると、創造的なエネルギーがどのように集中されるかは驚くべきことです。私は答えを出したと思います。時間を無駄にしている次の貧しい魂のために、ここに投稿することもできます.

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」指定を取り除くにはどうすればよいですか。タイムゾーンは、必要なときに命の恩人です。残りの時間は迷惑です。

于 2011-11-30T22:29:24.527 に答える