R 4.3.1中strftime遇无时分日期时强制所有时间转为午夜的问题
R 4.3.1中strftime处理混合格式日期字符串强制统一为午夜的问题解决
我有一组字符型日期时间字符串,其中午夜时刻的字符串因按最近小时向下取整处理,不含HH:MM部分。升级到R 4.3.1后发现:当列表里存在不带HH:MM的字符串时,用strftime统一格式会把所有返回的日期时间字符串都设为00:00,之前版本无此问题。
示例对比
符合预期的代码(所有字符串带时间部分):
strftime(c("2021-08-09 04:00:00", "2021-08-10 06:00"), format = "%Y-%m-%d %H:%M")返回:
"2021-08-09 04:00" "2021-08-10 06:00"出现异常的代码(混合带/不带时间的字符串):
strftime(c("2021-08-09 04:00:00", "2021-08-10"), format = "%Y-%m-%d %H:%M")返回:
"2021-08-09 00:00" "2021-08-10 00:00"
问题原因
R 4.3.1调整了日期时间字符串的解析逻辑:当向量中存在仅日期格式的元素时,strftime会将整个向量按纯日期类型处理,默认补全00:00的时间,覆盖了原本带时分元素的时间信息。
解决方案
方法1:用lubridate包自动匹配多格式
lubridate的parse_date_time能自动识别多种日期时间格式,避免统一解析导致的信息丢失:
library(lubridate) dates <- c("2021-08-09 04:00:00", "2021-08-10") parsed_dates <- parse_date_time(dates, orders = c("Ymd HMS", "Ymd")) strftime(parsed_dates, format = "%Y-%m-%d %H:%M")
输出结果:"2021-08-09 04:00" "2021-08-10 00:00"
方法2:基础R手动拆分处理
通过判断字符串是否包含时间部分,分别解析后再统一格式化:
dates <- c("2021-08-09 04:00:00", "2021-08-10") # 标记哪些元素带时间 has_time <- grepl("\\s", dates) # 初始化POSIXct向量 parsed_dates <- as.POSIXct(character(length(dates))) # 分别解析带时间和纯日期的元素 parsed_dates[has_time] <- as.POSIXct(dates[has_time]) parsed_dates[!has_time] <- as.POSIXct(dates[!has_time]) # 统一输出格式 strftime(parsed_dates, format = "%Y-%m-%d %H:%M")
同样能得到正确结果。
内容的提问来源于stack exchange,提问作者ANetTow
相关产品推荐
相关产品推荐

