【问题标题】:Two Timestamp Formats in RR中的两种时间戳格式
【发布时间】:2016-07-29 22:30:14
【问题描述】:

我有一个时间戳列,我正在将其转换为 POSIXct。问题是同一列中有两种不同的格式,所以如果我使用更常见的转换,另一个会被转换为 NA。

MC$Date    
12/1/15 22:00    
12/1/15 23:00    
12/2/15    
12/2/15 1:00    
12/2/15 2:00

我使用以下代码转换为 POSIXct:

MC$Date <- as.POSIXct(MC$Date, tz='MST', format = '%m/%d/%Y %H:%M')

结果:

MC$Date    
15-12-01 22:00:00    
15-12-01 23:00:00    
NA    
15-12-02 01:00:00    
15-12-02 02:00:00

我曾尝试使用逻辑向量来识别问题然后纠正它,但找不到简单的解决方案。

【问题讨论】:

    标签: r date datetime posix


    【解决方案1】:

    lubridate 包旨在处理此类情况。

    dt <- c(
    "12/1/15 22:00",
    "12/1/15 23:00", 
    "12/2/15",
    "12/2/15 1:00",
    "12/2/15 2:00"
    )
    dt
    [1] "12/1/15 22:00" "12/1/15 23:00" "12/2/15"       "12/2/15 1:00"  "12/2/15 2:00" 
    lubridate::mdy_hm(dt, truncated = 2)
    [1] "2015-12-01 22:00:00 UTC" "2015-12-01 23:00:00 UTC" "2015-12-02 00:00:00 UTC"
    [4] "2015-12-02 01:00:00 UTC" "2015-12-02 02:00:00 UTC"
    

    truncated 参数表示可以缺少多少种格式。

    如果UTC不合适,您可以添加tz参数来指定解析日期的时区。

    【讨论】:

      【解决方案2】:

      我认为逻辑向量方法可行。也许与一个临时向量一起保存已解析的日期而不会破坏未解析的日期。像这样的:

      dates <- as.POSIXct(MC$Date, tz='MST', format = '%m/%d/%Y %H:%M')
      dates[is.na(dates)] <- as.POSIXct(MC[is.na(dates),], tz='MST', format = '%m/%d/%Y')
      MC$Date <- dates
      

      【讨论】:

        【解决方案3】:

        由于您的所有日期时间都用日期和时间之间的空格分隔,因此您可以使用 strsplit 仅提取日期部分。

        extractDate <- function(x){ strsplit(x, split = " " )[[1]][1] }
        MC$Date <- sapply( MC$Date, extractDate )
        

        然后继续以任何你喜欢的方式转换,不用担心时间部分会妨碍你。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-04
          • 1970-01-01
          • 2018-11-25
          • 1970-01-01
          • 2011-12-04
          • 1970-01-01
          • 2021-04-05
          相关资源
          最近更新 更多