【问题标题】:Converting a column in R to type datetime: as.POSIXct returns NA将 R 中的列转换为日期时间类型:as.POSIXct 返回 NA
【发布时间】:2021-05-17 17:55:57
【问题描述】:

我在尝试将 char 类型的列转换为日期时间时遇到了困难。

 Date.Time  Lat Lon Base
<chr>   <dbl>   <dbl>   <chr>
4/1/2014 0:11:00    40.7690 -73.9549    B02512
4/1/2014 0:17:00    40.7267 -74.0345    B02512
4/1/2014 0:21:00    40.7316 -73.9873    B02512
⋮   ⋮   ⋮   ⋮
4/30/2014 23:31:00  40.7443 -73.9889    B02764
4/30/2014 23:32:00  40.6756 -73.9405    B02764
4/30/2014 23:48:00  40.6880 -73.9608    B02764

使用变异:

df <- mutate(df, Date.Time = as.POSIXct(Date.Time,
                 format = "%M/%D%/%Y% %H:%M%S"))

虽然 Date.Time 的类型已从 更改为 ,但整列只是 NAs。

Sys.getlocale() 的输出:

'LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_MESSAGES=C;LC_PAPER=en_US.UTF-8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=C'

【问题讨论】:

    标签: r kaggle


    【解决方案1】:

    您可以使用库anytime 来执行此操作。这是一个例子-

    date_var = "4/30/2014"
    
    library(anytime)
    anytime::anydate(date_var)
    

    结果

    > "2014-04-30"
    

    【讨论】:

      【解决方案2】:

      您输入的格式代码不正确。应该是 "%m/%d/%Y %H:%M:%S" 而不是 "%M/%D%/%Y% %H:%M%S"。其他一切都很好:

      library(dplyr)
      
      df <- read.table(header = TRUE, text = '
       Date.Time          Lat     Lon         Base
      "4/1/2014 0:11:00"    40.7690 -73.9549    B02512
      "4/1/2014 0:17:00"    40.7267 -74.0345    B02512
      "4/1/2014 0:21:00"    40.7316 -73.9873    B02512
      "4/30/2014 23:31:00"  40.7443 -73.9889    B02764
      "4/30/2014 23:32:00"  40.6756 -73.9405    B02764
      "4/30/2014 23:48:00"  40.6880 -73.9608    B02764')
      
      df2 <- mutate(df, Date.Time = as.POSIXct(Date.Time, 
                                              format = "%m/%d/%Y %H:%M:%S"))
      
      str(df2)
      # 'data.frame': 6 obs. of  4 variables:
      #   $ Date.Time: POSIXct, format: "2014-04-01 00:11:00" "2014-04-01 00:17:00" "2014-04-01 00:21:00" ...
      # $ Lat      : num  40.8 40.7 40.7 40.7 40.7 ...
      # $ Lon      : num  -74 -74 -74 -74 -73.9 ...
      # $ Base     : chr  "B02512" "B02512" "B02512" "B02764" ...
      

      【讨论】:

        【解决方案3】:

        lubridate 的选项

        library(dplyr)
        library(lubridate)
        df %>% 
          mutate(Date.Time = mdy_hms(Date.Time))
        

        【讨论】:

          【解决方案4】:

          其实你的尝试很正确,只是格式不对。

          as.POSIXct("4/1/2014 0:21:00", format = "%M/%D%/%Y% %H:%M%S")
          #> [1] NA
          

          如果您在年和日之后删除多余的 %,请在分钟和秒之间添加缺少的 :,并将年和月的代码设为小写字母(因为 %M 代表分钟,%D 是 @ 的缩写987654325@:

          as.POSIXct("4/1/2014 0:21:00", format = "%m/%d/%Y %H:%M:%S")
          #> [1] "2014-04-01 00:21:00 CEST"
          

          reprex package (v1.0.0) 于 2021-02-14 创建

          【讨论】:

            猜你喜欢
            • 2020-11-07
            • 2016-11-23
            • 1970-01-01
            • 1970-01-01
            • 2021-12-01
            • 2022-08-16
            • 2015-07-04
            • 2017-09-21
            相关资源
            最近更新 更多