为什么R包lubridate无法解析多种格式的向量?

Jes*_*mos 7 r date lubridate

我正在使用包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.

有谁经历过这种奇怪的行为?

dra*_*doc 1

这可能与您的系统区域设置有关。

  • 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)