在R中从min(dates):max(dates)还原Date对象的方法
问题:如何避免创建日期范围时Date对象转为整数?
先看示例代码中遇到的问题:
> dates <- as.Date(c('2020-01-01', '2020-01-02')) > min(dates) [1] "2020-01-01" > max(dates) [1] "2020-01-02" > min(dates):max(dates) [1] 18262 18263 > as.Date(min(dates):max(dates)) Error in as.Date.numeric(min(dates):max(dates)) : 'origin' must be supplied > as.Date(min(dates):max(dates), origin="1970-01-01") [1] "2020-01-01" "2020-01-02"
可以看到用冒号:创建日期范围时,Date对象会被转为整数,虽然通过指定origin参数能转换回来,但这确实是临时 workaround,更直接的方法是使用seq()函数:
解决方案:用seq()生成日期序列
seq()函数对Date类有专门的实现,可直接基于Date对象生成日期范围,无需转换为整数:
dates <- as.Date(c('2020-01-01', '2020-01-02')) # 生成从min到max的每日序列 seq(min(dates), max(dates), by = "day") # 输出:[1] "2020-01-01" "2020-01-02"
补充说明
- 冒号
:运算符原本是为数值类型设计的序列生成器,当作用于Date对象时,R会自动将其转换为底层存储的整数(即从1970-01-01开始的天数),所以得到的是整数序列。 seq()的by参数支持多种时间间隔,比如"week"、"month"、"year",能满足不同序列生成需求:# 生成按月的序列 seq(as.Date("2020-01-01"), as.Date("2020-03-01"), by = "month") # 输出:[1] "2020-01-01" "2020-02-01" "2020-03-01"
内容的提问来源于stack exchange,提问作者dfrankow
相关产品推荐
相关产品推荐

