代码之家  ›  专栏  ›  技术社区  ›  Abhishek BS

正在尝试转换字符格式的日期

  •  0
  • Abhishek BS  · 技术社区  · 7 年前

    我的数据集有90000多条记录。日期格式如下:

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

    我都快不行了

    [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 回复  |  直到 7 年前
        1
  •  1
  •   Julien Navarre    7 年前

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

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

    as.POSIXct(recfive$timestamp, format = "%Y-%m-%dT%H:%M:%SZ") 如果需要datetime对象

        2
  •  0
  •   Uwe    7 年前

    强制ISO 8601标准时间戳为类日期

    时间戳已在中 ISO 8601 standard format 这是明确的。因此 转换时需要格式规范 截止上课日期 :

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

    将ISO 8601标准时间戳强制为类POSIXct(datetime)

    强制为datetime对象(类)时 POSIXct ),必须指定时区。尽管如此,输入数据中已通过尾随字母指示时区 Z (作为 祖鲁语 = 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() 返回了表示一天开始的截断日期时间。

    要获取指定的完整日期时间, 像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")