tidyverse
最近在 添加 一个名为 clock
的包,除了已经有的 lubridate
包外,它还具有一些不错的功能:
library(clock)
x <- year_month_day_parse(df$Month, format = "%Y-%m", precision = "month")
日期操作和提取
这个输出是一个年-月-日向量,您仍然可以进行日期算术运算并应用其他常见函数,如预期的那样:
sort(x, decreasing = T)
# <year_month_day<month>[8]>
# [1] "2009-10" "2009-09" "2009-08" "2009-05" "2009-04" "2009-03" "2009-02" "2009-01"
add_months(x, 3)
# <year_month_day<month>[8]>
# [1] "2009-04" "2009-05" "2009-06" "2009-07" "2009-08" "2009-11" "2009-12" "2010-01"
add_years(x, -2)
# <year_month_day<month>[8]>
# [1] "2007-01" "2007-02" "2007-03" "2007-04" "2007-05" "2007-08" "2007-09" "2007-10"
get_month(x)
# [1] 1 2 3 4 5 8 9 10
如果需要,您还可以使用set_day
来设置日期:
set_day(x, 1)
<year_month_day<day>[8]>
[1] "2009-01-01" "2009-02-01" "2009-03-01" "2009-04-01" "2009-05-01" "2009-08-01"
[7] "2009-09-01" "2009-10-01"
处理无效日期
如果您想要使用此结构干净地获取每个月的最后一天,invalid_*
函数集可以帮助您:
# not 31 days in Feb, Apr, Sep
y <- set_day(x, 31)
# <year_month_day<day>[8]>
# [1] "2009-01-31" "2009-02-31" "2009-03-31" "2009-04-31" "2009-05-31" "2009-08-31"
# [7] "2009-09-31" "2009-10-31"
invalid_any(y)
[1] TRUE
invalid_detect(y)
[1] FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE
您可以使用invalid_resolve
处理无效日期,或者使用invalid_remove
删除它们:
invalid_resolve(y, invalid = "previous")
<year_month_day<day>[8]>
[1] "2009-01-31" "2009-02-28" "2009-03-31" "2009-04-30" "2009-05-31" "2009-08-31"
[7] "2009-09-30" "2009-10-31"
从文档中,您可以为
invalid
参数指定以下值来处理无效日期:
"previous":时间上的上一个有效时刻。
"previous-day":时间上的上一天有效日期,保留当天时间。
"next":时间上的下一个有效时刻。
"next-day":时间上的下一天有效日期,保留当天时间。
"overflow":将输入无效的天数溢出。舍弃时间。
"overflow-day":将输入无效的天数溢出。保留时间。
"NA":用NA替换无效日期。
"error":在无效日期上报错。
as.Date(month, format='%Y-%m-01')
并实现相同的结果。这种方法对我来说更加自然,因为在每个月份都指定相同日期更多地涉及到日期格式而不是字符串操作,但也许这是无意义的。 - JBecker> as.Date("2016-01", format="%Y-%m-01") # [1] NA
。我正在使用 R 3.3.1版本。 - n8sty