我正在使用包lubridate
来解析异构格式化日期的向量并将它们转换为字符串,如下所示:
parse_date_time(c('12/17/1996 04:00:00 PM','4/18/1950 0130'), c('%m/%d/%Y %I:%M:%S %p','%m/%d/%Y %H%M'))
Run Code Online (Sandbox Code Playgroud)
这是结果:
[1] NA NA
Warning message:
All formats failed to parse. No formats found.
Run Code Online (Sandbox Code Playgroud)
如果我删除%p
第一个格式字符串,它错误地解析第一个日期字符串,仍然不解析第二个,如下所示:
[1] "1996-12-17 04:00:00 UTC" NA
Warning message:
1 failed to parse.
Run Code Online (Sandbox Code Playgroud)
字符串中的4PM时间在结果中解析为4AM.
有谁经历过这种奇怪的行为?
这可能与您的系统区域设置有关。
parse_date_time {lubridate}
p:区域设置中的 AM/PM 指示器。与 I 一起使用,而不是与 H 一起使用。在某些语言环境中为空字符串。
因为不同的语言有不同的 AM/PM 字符串,如果您的区域设置不是英语,lubridate
即使您指定了 AM/PM 指示符,也不会拾取它。
操作系统中的区域设置可以包括显示语言、时间格式、时区。我使用的是带有美国时区和中文语言环境的英语窗口,所以我也在时间解析中与 AM/PM 作斗争。
Sys.getlocale("LC_TIME")
[1] "Chinese (Simplified)_China.936"
Run Code Online (Sandbox Code Playgroud)
您可以在 中指定区域设置parse_date_time {lubridate}
,但一开始它对我不起作用:
Sys.setlocale("LC_TIME", "en_US")
[1] ""
Warning message:
In Sys.setlocale("LC_TIME", "en_US") :
OS reports request to set locale to "en_US" cannot be honored
Run Code Online (Sandbox Code Playgroud)
locales {base}
语言环境描述了程序国际化的各个方面。最初,R 语言环境的大部分方面都设置为“C”(这是 C 语言的默认值,反映了北美的用法)。strptime 用于类别=“LC_TIME”的使用。
然后我发现了这个并使用它取得了成功:
Sys.setlocale("LC_TIME", "C")
[1] "C"
Run Code Online (Sandbox Code Playgroud)
之后解析工作:
parse_date_time('12/17/1996 04:00:00 PM', '%m/%d/%Y %I:%M:%S %p')
[1] "1996-12-17 16:00:00 UTC"
Run Code Online (Sandbox Code Playgroud)
您还可以指定时区和区域设置
parse_date_time('12/17/1996 04:00:00 PM', '%m/%d/%Y %I:%M:%S %p', tz = "America/New_York", locale = "C")
[1] "1996-12-17 16:00:00 EST"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4967 次 |
最近记录: |