R升级至4.2.2后lubridate日期转换函数失效求助
解决R 4.2.2中lubridate包dmy_hm等函数解析日期失败的问题
问题描述
在R 4.0.X版本中,可通过lubridate包的dmy_hm、ymd_hms等函数直接将字符串日期转换为日期时间对象,示例代码可正常运行:
library('lubridate') a <- '13/06/2019 18:00' dmy_hm(a)
升级至R 4.2.2并更新lubridate包后,上述代码报错:
All formats failed to parse. No formats found.
虽然parse_date_time函数可正常解析(示例如下),但大量原有脚本都使用了dmy_hm这类函数,修改成本过高,需找到恢复原函数功能的方法:
> parse_date_time(a, "dmy HM") 1 parsed with %d/%Om/%Y %H:%M [1] "2019-06-13 18:00:00 UTC"
系统环境信息
> Sys.getlocale (category = "LC_ALL") [1] "LC_COLLATE=French_France.1252;LC_CTYPE=French_France.1252;LC_MONETARY=French_France.1252;LC_NUMERIC=C;LC_TIME=French_France.1252" > version _ platform x86_64-w64-mingw32 arch x86_64 os mingw32 crt ucrt system x86_64, mingw32 status major 4 minor 2.2 year 2022 month 10 day 31 svn rev 83211 language R version.string R version 4.2.2 (2022-10-31 ucrt) nickname Innocent and Trusting
解决方法
方法1:临时切换区域设置
问题根源是系统LC_TIME设置为法语区域,高版本lubridate的dmy_hm等函数会依赖区域设置解析月份格式。可临时切换到英文区域完成解析,之后再恢复原设置:
# 保存原有时间区域设置 old_time_locale <- Sys.getlocale("LC_TIME") # 切换到英文区域 Sys.setlocale("LC_TIME", "English_US.1252") # 正常调用原有函数 a <- '13/06/2019 18:00' dmy_hm(a) # 恢复原时间区域设置 Sys.setlocale("LC_TIME", old_time_locale)
方法2:自定义包装函数
如果不想频繁修改区域设置,可以自定义与原函数同名的包装函数,内部调用parse_date_time并匹配对应格式,无需修改原有脚本的函数调用:
dmy_hm <- function(x) { parse_date_time(x, "dmy HM") } # 测试调用 a <- '13/06/2019 18:00' dmy_hm(a)
同理可给ymd_hms等其他函数编写对应的包装函数。
方法3:直接指定解析格式
高版本lubridate允许在dmy_hm中通过format参数明确指定日期格式,无需修改区域或替换函数:
a <- '13/06/2019 18:00' dmy_hm(a, format = "%d/%m/%Y %H:%M")
内容的提问来源于stack exchange,提问作者Jerry Magnin
相关产品推荐
相关产品推荐

