求助:使用R将Excel日期时间数值转换为正确datetime类型的问题
问题原因
核心问题是lubridate::as_datetime对数值参数的解读逻辑和as.Date完全不同:
as.Date()和lubridate::as_date()会把传入的数值当作相对于origin的天数,所以直接用Excel的日期数值(天数)能得到正确日期。- 而
lubridate::as_datetime()会把传入的数值当作相对于origin的秒数,你传入的45628.75只是约12.6小时的秒数,所以从1899-12-30开始累加后,日期自然几乎没变。
解决方案
有两种简单的修正方式:
方式1:把Excel天数转成秒数再用as_datetime
将Excel的日期数值乘以86400(一天的总秒数),再传入as_datetime:
excel_num <- 45628.7514467593 lubridate::as_datetime(excel_num * 86400, origin = "1899-12-30") # 输出结果:[1] "2024-12-02 18:02:05 UTC"
方式2:用openxlsx自带的转换函数
openxlsx专门提供了convertToDateTime()函数处理Excel日期数值,不用手动指定origin:
openxlsx::convertToDateTime(45628.7514467593) # 输出结果:[1] "2024-12-02 18:02:05 UTC"
额外优化:读取时直接识别日期时间
如果希望读取Excel时自动识别为日期时间类型,先检查Excel中该列的单元格格式是否为日期时间格式(而非文本格式)。如果是文本格式,detectDates=TRUE无法自动识别,可读取后用lubridate的dmy_hms()直接解析文本:
# 假设读取后的列名为datetime_text lubridate::dmy_hms(datetime_text)
内容的提问来源于stack exchange,提问作者deschen
相关产品推荐
相关产品推荐

