如何在 R 中解析具有 +13:00 偏移量的时间戳?
How can I parse timestamps with +13:00 offset in R?
我需要用R解析ISO8601中的字符,字符格式如下:
%Y-%m-%dT%H:%M:%S%z
导致问题的一个示例如下:
2000-01-02T13:00:00.000+13:00
我可以删除 UTC 偏移量中的 :
,但这没有任何用处。
我在 docker 容器构建中使用 rstudio 1.2.1335 运行:来自 rocker/geospatial 的最新版本 Dockerfile。 R的环境是:
> sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 9 (stretch)
Matrix products: default
BLAS/LAPACK: /usr/lib/libopenblasp-r0.2.19.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=en_US.UTF-8
[6] LC_MESSAGES=C LC_PAPER=en_US.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] parsedate_1.2.0 sos4R_0.4.0.9002 stringr_1.4.0 httr_1.4.0 webmockr_0.3.4 testthat_2.1.1
loaded via a namespace (and not attached):
[1] Rcpp_1.0.1 compiler_3.6.0 pillar_1.4.0 remotes_2.0.4 prettyunits_1.0.2 tools_3.6.0 digest_0.6.18
[8] packrat_0.5.0 pkgbuild_1.0.3 uuid_0.1-2 pkgload_1.0.2 memoise_1.1.0 tibble_2.1.1 lattice_0.20-38
[15] anytime_0.3.3 pkgconfig_2.0.2 rlang_0.3.4 cli_1.1.0 rstudioapi_0.10 withr_2.1.2 xml2_1.2.0
[22] fs_1.3.1 fauxpas_0.2.0 desc_1.2.0 devtools_2.0.2 rprojroot_1.3-2 grid_3.6.0 glue_1.3.1
[29] R6_2.4.0 processx_3.3.1 sessioninfo_1.1.1 sp_1.3-1 callr_3.2.0 magrittr_1.5 rematch2_2.0.1
[36] usethis_1.5.0 ps_1.3.0 backports_1.1.4 assertthat_0.2.1 RApiDatetime_0.0.4 stringi_1.4.3 crayon_1.3.4
我尝试使用 lubridate
、parsedate
、anytime
,但其中 none 似乎能够正确解析时区。
最后,我尝试了 here at stack overflow 提供的解决方案,结果如下:
> timestring <- "2000-01-02T13:00:00.000+13:00"
> fmt <- "%Y-%m-%dT%H:%M:%S%z"
> cleanedTimestring <- gsub("(.*).(..)$","\1\2",timestring)
> parsedTime <- strptime(cleanedTimestring, fmt, tz = "UTC")
> str(parsedTime)
POSIXlt[1:1], format: NA
将 UTC 偏移量更改为 12:00
并删除毫秒 .000
时,创建了一个几乎有用的结果:
> timestring <- "2000-01-02T13:00:00+12:00"
> cleanedTimestring <- gsub("(.*).(..)$","\1\2",timestring)
> parsedTime <- strptime(cleanedTimestring, fmt, tz = "UTC")
> str(parsedTime)
POSIXlt[1:1], format: "2000-01-02 01:00:00"
> parsedTime
[1] "2000-01-02 01:00:00 UTC"
但这预处理太多了,由于缺少毫秒,我丢失了信息。
我希望能够将 2000-01-02T13:00:00.000+13:00
之类的字符串解析为 POSIXct
,结果如下:
[1] "2000-01-02 13:00:00.000 NZDT"
或
[1] "2000-01-02T13:00:00.000+13:00"
是否有任何库可以做到这一点?
请记住,我事先并不知道时间戳的时区。它们可能以 UTC 偏移量或 ID 的形式出现(例如 +13:00|+1300
与 NZDT
.
您需要任何其他详细信息吗?
如果你只需要同时容纳毫秒而不是毫秒,那么你可以这样做
timestring <- c(
"2000-01-02T13:00:00.000+13:00",
"2000-01-02T13:00:00+12:00"
)
formats <- c("%Y-%m-%dT%H:%M:%S%z", "%Y-%m-%dT%H:%M:%OS%z")
lubridate::parse_date_time(timestring, c("%Y-%m-%dT%H:%M:%S%z", "%Y-%m-%dT%H:%M:%OS%z"), exact=TRUE)
# [1] "2000-01-02 00:00:00 UTC" "2000-01-02 01:00:00 UTC"
我需要用R解析ISO8601中的字符,字符格式如下:
%Y-%m-%dT%H:%M:%S%z
导致问题的一个示例如下:
2000-01-02T13:00:00.000+13:00
我可以删除 UTC 偏移量中的 :
,但这没有任何用处。
我在 docker 容器构建中使用 rstudio 1.2.1335 运行:来自 rocker/geospatial 的最新版本 Dockerfile。 R的环境是:
> sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 9 (stretch)
Matrix products: default
BLAS/LAPACK: /usr/lib/libopenblasp-r0.2.19.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=en_US.UTF-8
[6] LC_MESSAGES=C LC_PAPER=en_US.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] parsedate_1.2.0 sos4R_0.4.0.9002 stringr_1.4.0 httr_1.4.0 webmockr_0.3.4 testthat_2.1.1
loaded via a namespace (and not attached):
[1] Rcpp_1.0.1 compiler_3.6.0 pillar_1.4.0 remotes_2.0.4 prettyunits_1.0.2 tools_3.6.0 digest_0.6.18
[8] packrat_0.5.0 pkgbuild_1.0.3 uuid_0.1-2 pkgload_1.0.2 memoise_1.1.0 tibble_2.1.1 lattice_0.20-38
[15] anytime_0.3.3 pkgconfig_2.0.2 rlang_0.3.4 cli_1.1.0 rstudioapi_0.10 withr_2.1.2 xml2_1.2.0
[22] fs_1.3.1 fauxpas_0.2.0 desc_1.2.0 devtools_2.0.2 rprojroot_1.3-2 grid_3.6.0 glue_1.3.1
[29] R6_2.4.0 processx_3.3.1 sessioninfo_1.1.1 sp_1.3-1 callr_3.2.0 magrittr_1.5 rematch2_2.0.1
[36] usethis_1.5.0 ps_1.3.0 backports_1.1.4 assertthat_0.2.1 RApiDatetime_0.0.4 stringi_1.4.3 crayon_1.3.4
我尝试使用 lubridate
、parsedate
、anytime
,但其中 none 似乎能够正确解析时区。
最后,我尝试了 here at stack overflow 提供的解决方案,结果如下:
> timestring <- "2000-01-02T13:00:00.000+13:00"
> fmt <- "%Y-%m-%dT%H:%M:%S%z"
> cleanedTimestring <- gsub("(.*).(..)$","\1\2",timestring)
> parsedTime <- strptime(cleanedTimestring, fmt, tz = "UTC")
> str(parsedTime)
POSIXlt[1:1], format: NA
将 UTC 偏移量更改为 12:00
并删除毫秒 .000
时,创建了一个几乎有用的结果:
> timestring <- "2000-01-02T13:00:00+12:00"
> cleanedTimestring <- gsub("(.*).(..)$","\1\2",timestring)
> parsedTime <- strptime(cleanedTimestring, fmt, tz = "UTC")
> str(parsedTime)
POSIXlt[1:1], format: "2000-01-02 01:00:00"
> parsedTime
[1] "2000-01-02 01:00:00 UTC"
但这预处理太多了,由于缺少毫秒,我丢失了信息。
我希望能够将 2000-01-02T13:00:00.000+13:00
之类的字符串解析为 POSIXct
,结果如下:
[1] "2000-01-02 13:00:00.000 NZDT"
或
[1] "2000-01-02T13:00:00.000+13:00"
是否有任何库可以做到这一点?
请记住,我事先并不知道时间戳的时区。它们可能以 UTC 偏移量或 ID 的形式出现(例如 +13:00|+1300
与 NZDT
.
您需要任何其他详细信息吗?
如果你只需要同时容纳毫秒而不是毫秒,那么你可以这样做
timestring <- c(
"2000-01-02T13:00:00.000+13:00",
"2000-01-02T13:00:00+12:00"
)
formats <- c("%Y-%m-%dT%H:%M:%S%z", "%Y-%m-%dT%H:%M:%OS%z")
lubridate::parse_date_time(timestring, c("%Y-%m-%dT%H:%M:%S%z", "%Y-%m-%dT%H:%M:%OS%z"), exact=TRUE)
# [1] "2000-01-02 00:00:00 UTC" "2000-01-02 01:00:00 UTC"