r - 使用带有特殊时区格式的 strptime %z

标签 r timezone strptime string-to-datetime

我正在处理从 Teradata 导出的 .csv 数据。几列最初是带时区的时间戳,因此在 R 中加载 .csv 后,我想将这些列(作为字符串加载)转换为 POSIXlt 或 POSIXct。我正在使用 strptime ,但 .csv 文件中的时区格式与 strptime 不匹配正在期待。例如,它期望 -0400但 .csv 的格式为 -04:00其中冒号分隔小时和分钟。

我可以去除冒号,但这是一个额外的步骤和并发症,如果可能的话,我想避免。有没有办法告诉strptime使用不同的时区格式( %z )?

下面是一个例子:

## Example data:
x <- c("2011-10-12 22:17:13.860746-04:00", "2011-10-12 22:17:13.860746+00:00")
format <- "%Y-%m-%d %H:%M:%OS%z"

## Doesn't work:
strptime(x,format)
## [1] NA NA

## Ignores the timezone:
as.POSIXct(x)
## [1] "2011-10-12 22:17:13 EDT" "2011-10-12 22:17:13 EDT"

## Remove the last colon:
x2 <- gsub("(.*):", "\\1", x)
x2
## [1] "2011-10-12 22:17:13.860746-0400" "2011-10-12 22:17:13.860746+0000"

## This works, but requires extra processing (removing the colon)
strptime(x2,format)
## [1] "2011-10-12 22:17:13" "2011-10-12 18:17:13"

所以我希望使用类似 strptime(x,"%Y-%m-%d %H:%M:%OS%zz") 的方法来实现最后一个结果。 ,其中 %zz是用于识别 -04:00 的时区的自定义表达式格式。或 %zH:%zM可能会更好。

如果这是不可能的,是否有人拥有将字符串(各种格式)转换为 data.frame/data.table 多列的日期的巧妙/灵活的功能?

最佳答案

原来lubridate可以处理这种格式:

library(lubridate)
ymd_hms(x)
## [1] "2011-10-13 02:17:13 UTC" "2011-10-12 22:17:13 UTC"

或者,以本地时区显示:
with_tz(ymd_hms(x))
## [1] "2011-10-12 22:17:13 EDT" "2011-10-12 18:17:13 EDT"

为了获得更大的灵活性(仍在使用 lubridate ):
parse_date_time(x, "%Y-%m-%d %H:%M:%OS%z")

为了更快的速度(在 lubridate 选项中):
lubridate:::.strptime(x, "%Y-%m-%d %H:%M:%OS%OO")

时间:
microbenchmark(
  ymd_hms(x),
  parse_date_time(x, "%Y-%m-%d %H:%M:%OS%z"),
  lubridate:::.strptime(x, "%Y-%m-%d %H:%M:%OS%OO"),
  strptime(gsub("(.*):", "\\1", x), format)
)

## Unit: microseconds
##                                               expr      min       lq       mean    median        uq      max neval
##                                         ymd_hms(x) 1523.819 1578.495 1715.14577 1629.5385 1744.3695 2850.393   100
##         parse_date_time(x, "%Y-%m-%d %H:%M:%OS%z") 1108.676 1150.633 1273.77301 1190.3315 1264.8050 5947.204   100
##  lubridate:::.strptime(x, "%Y-%m-%d %H:%M:%OS%OO")   89.838  103.390  112.45338  107.8425  115.2265  216.512   100
##        strptime(gsub("(.*):", "\\\\1", x), format)   46.716   58.294   71.90934   69.9415   86.5860  105.044   100

关于r - 使用带有特殊时区格式的 strptime %z,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15032184/

相关文章:

python - 从字符串到带或不带毫秒的日期时间

r - dplyr top_n 中的权重变量

r - 模拟浏览器访问 Google 趋势数据

javascript - 如何在javascript中获取所有时区的列表

javascript - 从 YYYY-DD-MM HH :MM:SS UTC--3 format 解析 JavaScript/jQuery 中带时区的日期和时间

PyArrow 的时间戳数据问题

r - 使用 a.m./p.m 解析时间戳

r - ggplot2:如何拥有不同颜色的 geom_vline()

r - 如何在R中的循环中获取索引

javascript - 如何从 Javascript 中的字符串获取时区偏移量