在R语言中获取自Epoch以来的天数、月数及周数的最优方法
在R语言中获取自Epoch以来的天数、周数和月数的最优方法
在R里计算自Epoch(1970-01-01 UTC)以来的这些时间差,其实有挺直观的方法,尤其是借助lubridate包能省不少事,比自己用基础R硬算靠谱多了。咱们一步步来拆解:
先回顾你已经掌握的秒数获取
你已经知道怎么拿自Epoch以来的秒数了,就是把当前时间转成整数:
as.integer(Sys.time()) # 返回自Epoch以来的秒数
1. 获取自Epoch以来的天数
基础R方法
把当前时间转成Date类型,再和Epoch日期做减法就行——因为Date类型相减得到的结果就是天数:
# 定义Epoch的日期对象 epoch_date <- as.Date("1970-01-01") # 获取当前日期 current_date <- as.Date(Sys.time()) # 计算天数差,转成整数 days_since_epoch <- as.integer(current_date - epoch_date) days_since_epoch
lubridate最优方法
lubridate是R里处理日期时间的神器,代码更简洁,可读性也强:
library(lubridate) # 方法1:直接日期相减 days_since_epoch <- as.integer(today() - ymd("1970-01-01")) # 方法2:用interval更清晰(适合后续复用计算其他时间差) epoch_interval <- interval(ymd("1970-01-01"), today()) days_since_epoch <- as.integer(time_length(epoch_interval, "days"))
2. 获取自Epoch以来的周数
周数的计算要注意:如果是要总周数(不管周几开始),直接用天数除以7就行;如果是要ISO标准周数(每年的第N周),逻辑会不一样,这里先讲最常用的总周数:
基础R方法
用刚才算好的天数做整数除法:
weeks_since_epoch <- days_since_epoch %/% 7
lubridate最优方法
直接用之前定义的epoch_interval,指定时间单位为"weeks":
weeks_since_epoch <- as.integer(time_length(epoch_interval, "weeks"))
如果需要ISO周数的话,可以用isoweek()函数计算当前日期的ISO周,再减去1970年1月1日的ISO周,但这种场景比较少见,一般总周数就够日常需求了。
3. 获取自Epoch以来的月数
这个是最容易踩坑的——因为每个月天数不一样,绝对不能用天数除以30来估算!必须用日期时间工具计算准确的月份差:
基础R方法
得手动拆解年份和月份来计算:
# 把当前时间转成POSIXlt,提取年份和月份(月份是0索引,1月=0) current_year_month <- as.POSIXlt(Sys.time())$year * 12 + as.POSIXlt(Sys.time())$mon # Epoch的年份月份:1970年1月=1970*12 + 0 epoch_year_month <- 1970 * 12 + 0 # 计算月份差 months_since_epoch <- current_year_month - epoch_year_month
lubridate最优方法
还是用epoch_interval,指定时间单位为"months",一步到位,还能自动处理闰年、不同月份天数的问题:
months_since_epoch <- as.integer(time_length(epoch_interval, "months"))
总结最优方案
优先推荐使用lubridate包,原因很简单:
- 代码更简洁,逻辑一目了然,不用自己处理日期的各种边缘情况
- 计算月数这类复杂时间差时,准确性更高,避免手动计算出错
内容的提问来源于stack exchange,提问作者Soumya Boral
相关产品推荐
相关产品推荐

