R中如何将POSIXct日期时间对象转换为随时间递增的十进制数值
R中POSIXct时间转严格递增十进制数的实现方法
错误原因说明
你原有转换逻辑的问题出在时间单位换算错误:分钟部分需要折算为天的占比,因此应该除以24*60(即1440,一天的总分钟数),而非除以60。你原有写法相当于把分钟折算为小时量级直接叠加,因此会得到不符合时间顺序的错误结果。如果需要保留秒级精度,秒需要除以24*3600(即86400,一天的总秒数)。
实现方案
方案1:修复年积日+时间的换算逻辑
如果你需要保留「年积日+当日时间占比」的十进制格式,可以用修正后的代码:
library(lubridate) data$date_time2 <- yday(data$date_time) + hour(data$date_time)/24 + minute(data$date_time)/(24*60) + second(data$date_time)/(24*3600)
运行后你给出的示例数据会得到严格递增的结果:175.7757 175.7965 175.8174 175.8382 175.8590。
方案2:直接转换POSIXct为数值(更稳妥)
POSIXct对象的底层存储本身就是从1970-01-01 00:00:00开始计算的秒数,直接转为数值就天然是严格随时间递增的,不需要手动拆分时间单位,也不会出现跨天、跨年的换算错误:
# 输出单位为秒,时间越晚数值越大 data$date_time_num <- as.numeric(data$date_time) # 如果需要以天为单位的十进制数,除以86400即可 data$date_time_day <- as.numeric(data$date_time)/86400
内容的提问来源于stack exchange,提问作者Jordanna
相关产品推荐
相关产品推荐

