You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:10:50