代码之家  ›  专栏  ›  技术社区  ›  kittygirl

像POSIXct `获取`“%Y-%m-%d%H:%m:%S”`格式的错误

  •  0
  • kittygirl  · 技术社区  · 5 年前
    dates <- seq(1626629937,1626629944)
    
    # CORRECT
    
    ## #1
    as.POSIXct(dates,                    tz="Asia/Shanghai",origin="1970-01-01")
    #> [1] "2021-07-19 01:38:57 CST" "2021-07-19 01:38:58 CST" "2021-07-19 01:38:59 CST" "2021-07-19 01:39:00 CST"
    #> [5] "2021-07-19 01:39:01 CST" "2021-07-19 01:39:02 CST" "2021-07-19 01:39:03 CST" "2021-07-19 01:39:04 CST"
    
    ## #2
    as.POSIXct(dates,                    tz="Asia/Shanghai",origin="1970-01-01",optional = FALSE)
    #> [1] "2021-07-19 01:38:57 CST" "2021-07-19 01:38:58 CST" "2021-07-19 01:38:59 CST" "2021-07-19 01:39:00 CST"
    #> [5] "2021-07-19 01:39:01 CST" "2021-07-19 01:39:02 CST" "2021-07-19 01:39:03 CST" "2021-07-19 01:39:04 CST"
    
    
    # DIFFERENT RESULT
    
    ## #3
    as.POSIXct(dates,"%Y-%m-%d %H:%M:%S"                   ,origin="1970-01-01")
    #> [1] "2021-07-18 17:38:57" "2021-07-18 17:38:58" "2021-07-18 17:38:59" "2021-07-18 17:39:00" "2021-07-18 17:39:01"
    #> [6] "2021-07-18 17:39:02" "2021-07-18 17:39:03" "2021-07-18 17:39:04"
    
    
    # NAs
    
    ## #4
    as.POSIXct(dates,"%Y-%m-%d %H:%M:%S",tz="Asia/Shanghai",origin="1970-01-01")
    #> [1] NA NA NA NA NA NA NA NA
    
    ## #5
    as.POSIXct(dates,"%Y-%m-%d %H:%M:%S",tz="Asia/Shanghai",origin="1970-01-01",optional = FALSE)
    #> [1] NA NA NA NA NA NA NA NA
    
    
    # ERROR
    
    ## #6
    as.POSIXct(dates,"%Y-%m-%d %H:%M:%S"                                       ,optional = FALSE)
    #>  Error in as.POSIXct.numeric(as.integer(.), "%Y-%m-%d %H:%M:%S", optional = FALSE) : 
    #>   'origin' must be supplied 
    

    作为上述R脚本的输出,格式为“%Y-%m-%d%H:%m:%S” tz , origin , optional 参数原因 NA .

    问题出在哪里?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Edo    5 年前

    简单的第一个:

    • optional = FALSE 是默认值:因此#1==#2和#4==#5
    • #6不需要解释:你需要论据 origin = 如错误状态
    • #3由于时区( tz= 论点因此,它显示在8小时前。

    现在,问题是#4和#5(与我之前所说的相同):

    as.POSIXct(dates,"%Y-%m-%d %H:%M:%S",tz="Asia/Shanghai",origin="1970-01-01")
    #> [1] NA NA NA NA NA NA NA NA
    

    要了解这是如何工作的,您需要查看函数 as.POSIXct ,当使用数字调用时 x (像本例中一样),调用方法: as.POSIXct.numeric .

    as.POSIXct.numeric
    
    #> function (x, tz = "", origin, ...) 
    #> {
    #>     if (missing(origin)) {
    #>         if (!length(x)) 
    #>             return(.POSIXct(numeric(), tz))
    #>         if (!any(is.finite(x))) 
    #>             return(.POSIXct(x, tz))
    #>         stop("'origin' must be supplied")
    #>     }
    #>     .POSIXct(as.POSIXct(origin, tz = "GMT", ...) + x, tz)
    #> }
    #> <bytecode: 0x55df7f23b390>
    #> <environment: namespace:base>
    

    关注这一行:

    #> .POSIXct(as.POSIXct(origin, tz = "GMT", ...) + x, tz)
    

    特别地:

    as.POSIXct(origin, tz = "GMT", ...) + x
    

    如您所见,函数转换 origin 在datetime中,然后它对您估算的数字输入求和。你提供的每一个额外论点都属于 ... .

    函数尝试转换 1970-01-01 使用您提供的格式到日期时间: %Y-%m-%d %H:%M:%S . 自起源以来 1970-01-01 具有格式 %Y-%m-%d ,函数无法将原点从字符串转换为POSIX,因此返回 NA (那就是 NA s已生成!)

    当您将数字转换为POSIX时,作为参数添加的格式既不适用于输出(因为它将始终是POSIX),也不适用于输入,而是适用于 起源 因此 起源 format 需要匹配。

    要解决您的问题,您需要使用 起源 具有格式 %Y-%m-%d%H:%m:%S . 这样地:

    as.POSIXct(dates,"%Y-%m-%d %H:%M:%S",tz="Asia/Shanghai",origin="1970-01-01 00:00:00")
    #> [1] "2021-07-19 01:38:57 CST" "2021-07-19 01:38:58 CST" "2021-07-19 01:38:59 CST" "2021-07-19 01:39:00 CST"
    #> [5] "2021-07-19 01:39:01 CST" "2021-07-19 01:39:02 CST" "2021-07-19 01:39:03 CST" "2021-07-19 01:39:04 CST"
    

    或者您需要使用以下格式: %Y-%m-%d 这样地:

    as.POSIXct(dates,"%Y-%m-%d",tz="Asia/Shanghai",origin="1970-01-01")
    #> [1] "2021-07-19 01:38:57 CST" "2021-07-19 01:38:58 CST" "2021-07-19 01:38:59 CST" "2021-07-19 01:39:00 CST"
    #> [5] "2021-07-19 01:39:01 CST" "2021-07-19 01:39:02 CST" "2021-07-19 01:39:03 CST" "2021-07-19 01:39:04 CST"
    

    结果等于#1和#2。

    推荐文章