【问题标题】:Generate a sequence of the last day of the month over two years生成两年内每月最后一天的序列
【发布时间】:2012-01-10 03:43:02
【问题描述】:

我使用 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'

【问题讨论】:

    标签: r date lubridate


    【解决方案1】:

    令人惊讶的是,输入问题如何集中创造力。我想我想出了答案。我不妨把它贴在这里,以供下一个发现自己在浪费时间的可怜人。

    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”名称。时区在需要时可以挽救生命。其余的时间它们都是令人讨厌的。

    【讨论】:

    • 使用strftime(date) 摆脱时区。所以strftime('2010-10-31 UTC') 会给你2010-10-31。
    • @SachaEpskamp:Stackoverflow 只允许我在两天后接受我的回答。我想这很聪明。可能还有另一种更优雅的解决方法。
    • @Ramnath strftime 给了我前一天的日期,因为我住在午夜 UTC 实际上是前一天的 19:00。我在东部时区。 strftime(ymd("2010-02-01")+ 月(0:23)-days(1)) [1] "2010-01-30 19:00:00" "2010-02-27 19:00: 00" "2010-03-30 20:00:00" 等
    【解决方案2】:

    是的,您找到了正确的窍门:从下个月的第一天开始返回前一天。

    这是作为基础 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,像这样的简单任务不需要它(虽然是一个很好的包)。另外,它对现有基础函数的重载仍然让我觉得有些危险......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-20
      • 2018-05-16
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 2015-07-09
      • 2022-01-01
      相关资源
      最近更新 更多