R 将日期、时间和时区字符串转换为 POSIXct



日期解析错误

我在字符到日期时间转换方面遇到问题,希望能帮助了解出了什么问题。为此,我定义了一个非常简单的数据框,其中包含两行,其中包含每行的 ID、时区、日期和时间。我想添加一个列,其中包含一个(例如)POSIXct 条目,用于组合日期时间,包括正确的时区。(这是一个合成示例,但我想将其应用于更大的数据集。

首先,我们尝试使用 R 的基本设施将这些功能组合成数据、时间和时区的统一表示。

d <- data.frame(id=c(111, 222), 
tzz=c("Europe/Berlin", "US/Eastern"), 
d=c("09-Sep-2017", "11-Sep-2017"), 
t=c("23:42:13", "22:05:17"),
stringsAsFactors = FALSE)
d$dt <- strptime(paste(d$d, d$t), tz=d$tzz, format="%d-%b-%Y %T")
Error in strptime(paste(d$d, d$t), tz = d$tzz, format = "%d-%b-%Y %T") : 
invalid 'tz' value

这种方法失败了,尽管我不清楚为什么。例如,我可以轻松地进行非矢量化版本。此外,我使用的时区似乎是官方支持列表的一部分。

d$tzz %in% OlsonNames()
[1] TRUE TRUE
dt1 <- strptime(paste(d$d[1], d$t[1]), tz=d$tzz[1], format="%d-%b-%Y %T")
print(dt1)
[1] "2017-09-09 23:42:13 CEST"
print(tz(dt1))
[1] "Europe/Berlin"
dt2 <- strptime(paste(d$d[2], d$t[2]), tz=d$tzz[2], format="%d-%b-%Y %T")
print(dt2)
[1] "2017-09-11 22:05:17 EDT"
print(tz(dt2))
[1] "US/Eastern"

另外,考虑到我的问题可能在于误解如何使用 strptime,我随后尝试了类似的润滑剂方法:

library(lubridate)
d$dt <- dmy_hms(paste(d$d, d$t), tz=d$tzz)
Error in strptime(.enclose(x), .enclose(fmt), tz) : invalid 'tz' value

但得到了同样的错误。同样,非矢量版本工作正常。

dt1l <- dmy_hms(paste(d$d[1], d$t[1]), tz=d$tzz[1])
print(dt1l)
[1] "2017-09-09 23:42:13 CEST"
print(tz(dt1l))
[1] "Europe/Berlin"

尝试在整洁中变异会产生同样的问题。(顺便说一下,CEST 不在 OlsonNames 集中。

有关如何正确执行此操作的帮助,或者至少解释这是如何出错的,将不胜感激。

尝试像这样逐行计算:

library(dplyr)
d %>%
rowwise() %>%
mutate(ct = as.POSIXct(paste(d, t), format = "%d-%b-%Y %H:%M:%S", tz = tzz)) %>%
ungroup

给:

# A tibble: 2 x 5
id tzz           d           t        ct                 
<dbl> <chr>         <chr>       <chr>    <dttm>             
1  111. Europe/Berlin 09-Sep-2017 23:42:13 2017-09-09 17:42:13
2  222. US/Eastern    11-Sep-2017 22:05:17 2017-09-11 22:05:17

与 Gabor 类似,但data.table使用了 id 是唯一的事实:

R> dt <- data.table(d)
R> dt[ , ct := as.POSIXct(paste(d, t), "%d-%b-%Y %H:%M:%S", tz=tzz), by=id][]
id           tzz           d        t                  ct
1: 111 Europe/Berlin 09-Sep-2017 23:42:13 2017-09-09 17:42:13
2: 222    US/Eastern 11-Sep-2017 22:05:17 2017-09-11 22:05:17
R> 

相关内容

  • 没有找到相关文章

最新更新