试图转换字符格式的日期

时间:2018-02-08 15:48:05

标签: r date as.date

我的数据集有90,000个奇数记录。日期格式如下:

timestamp
2018-01-27T09:01:49Z
2018-01-27T00:04:08Z
2018-01-27T09:04:22Z
2018-01-27T09:04:28Z
2018-01-27T00:07:38Z

我试过

as.Date(recfive$timestamp, "%Y/%m/%d %H:%M:%S")

我得到所有NA

[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

2 个答案:

答案 0 :(得分:1)

字符串中的日期分隔符为“ - ”而不是“/”

尝试as.Date(recfive$timestamp, "%Y-%m-%d")

as.POSIXct(recfive$timestamp, format = "%Y-%m-%dT%H:%M:%SZ")如果你想要一个日期时间对象

答案 1 :(得分:0)

将ISO 8601标准时间戳强制转换为类Date

时间戳已经在ISO 8601 standard format中,这是明确的。因此,将转换为类Date 时需要 no 格式规范:

as.Date(recfive$timestamp)
#> [1] "2018-01-27" "2018-01-27" "2018-01-27" "2018-01-27" "2018-01-27"

将ISO 8601标准时间戳强制转换为POSIXct类(日期时间)

当强制转换为日期时间对象(类POSIXct)时,必须指定时区。虽然时区已经在输入数据中用尾随字母Z表示(如 Zulu = UTC ),但不幸的是,输入会忽略此时区。

在我当前的语言环境中,使用本地时区创建一个POSIXct对象,其中时间戳表示时间上指定的不同实例(在冬季,CET比UTC提前一小时)。

as.POSIXct(recfive$timestamp)
#> [1] "2018-01-27 CET" "2018-01-27 CET" "2018-01-27 CET" "2018-01-27 CET" "2018-01-27 CET"

因此,必须明确指定时区:

as.POSIXct(recfive$timestamp, tz = "UTC")
#> [1] "2018-01-27 UTC" "2018-01-27 UTC" "2018-01-27 UTC" "2018-01-27 UTC" "2018-01-27 UTC"

请注意,as.POSIXct()返回了截断日期时间,表示当天的开始。

要获得指定的完整日期时间,可以使用格式规范调用as.POSIXct()

as.POSIXct(recfive$timestamp, format = "%FT%TZ", tz = "UTC")
#> [1] "2018-01-27 09:01:49 UTC" "2018-01-27 00:04:08 UTC" "2018-01-27 09:04:22 UTC"
#> [4] "2018-01-27 09:04:28 UTC" "2018-01-27 00:07:38 UTC"

或者,有许多软件包专门将日期时间字符串简化或快速更改为类POSIXct,它们都返回相同的结果:

lubridate::ymd_hms(recfive$timestamp)

anytime::anytime(recfive$timestamp, asUTC = TRUE)
anytime::utctime(recfive$timestamp, tz = "UTC")

fasttime::fastPOSIXct(recfive$timestamp, tz = "UTC")

数据

recfive <- data.table::fread(
"timestamp
2018-01-27T09:01:49Z
2018-01-27T00:04:08Z
2018-01-27T09:04:22Z
2018-01-27T09:04:28Z
2018-01-27T00:07:38Z")