【问题标题】:Data frame with date field as a factor and mix of date values以日期字段为因子和日期值混合的数据框
【发布时间】:2015-10-10 00:14:01
【问题描述】:

我有一个以日期字段为因子的数据框,并混合了如下值。如何标准化、转换为日期格式并提取月份和年份?

1  Oct 24 2013  3:59PM     
2  Nov  5 2013  3:00PM     
3  Nov 26 2013  1:00PM      
4  2015-05-05 21:09:00      
5  Nov 19 2013  1:00PM      
6  2015-05-28 20:23:00      
7  2015-05-28 20:24:00      
8  Nov 12 2013  1:00PM      
9  2015-05-28 20:29:00      
10 2015-05-28 20:26:00      

【问题讨论】:

  • 到目前为止你尝试过什么?
  • 没什么用 hereherehere?

标签: r datetime


【解决方案1】:

查看是否可以用一种格式解析数据(在这种情况下为as.POSIXct.factor 的默认格式),如果不成功则尝试另一种格式:

 dats$dt2 <- as.POSIXct( # Needed b/c get numeric values from the `if(){}`; Why?
              sapply(trim(dats$dt),   # sjmisc:trim() only needed if have extra spaces
                function(d) if( !is.na( strptime(d, "%Y-%m-%d %H:%M:%S") ) ){
                       as.POSIXct(d)      } else {
                       as.POSIXct( d, format="%b %d %Y  %H:%M%p") }), origin="1970-01-01" )

【讨论】:

    【解决方案2】:

    您可以尝试 lubridate 包中的parse_date_time()。我发现它使处理多种格式变得容易得多。这只是摆弄orders 参数的问题。这里我们可以使用c("mdyR", "ymdT") 作为我们的orders 向量。

    library(lubridate)
    parse_date_time(df$V1, c("mdyR", "ymdT"))
    # [1] "2013-10-24 15:59:00 UTC" "2013-11-05 15:00:00 UTC"
    # [3] "2013-11-26 13:00:00 UTC" "2015-05-05 21:09:00 UTC"
    # [5] "2013-11-19 13:00:00 UTC" "2015-05-28 20:23:00 UTC"
    # [7] "2015-05-28 20:24:00 UTC" "2013-11-12 13:00:00 UTC"
    # [9] "2015-05-28 20:29:00 UTC" "2015-05-28 20:26:00 UTC"
    

    要提取月份和年份,我们可以执行以下操作。

    pdt <- parse_date_time(df$V1, c("mdyR", "ymdT"))
    month(pdt)
    # [1] 10 11 11  5 11  5  5 11  5  5
    year(pdt)
    # [1] 2013 2013 2013 2015 2013 2015 2015 2013 2015 2015
    

    数据:

    df <- structure(list(V1 = structure(c(10L, 9L, 8L, 1L, 7L, 2L, 3L, 
    6L, 5L, 4L), .Label = c("2015-05-05 21:09:00", "2015-05-28 20:23:00", 
    "2015-05-28 20:24:00", "2015-05-28 20:26:00", "2015-05-28 20:29:00", 
    "Nov 12 2013  1:00PM", "Nov 19 2013  1:00PM", "Nov 26 2013  1:00PM", 
    "Nov  5 2013  3:00PM", "Oct 24 2013  3:59PM"), class = "factor")), .Names = "V1", class = "data.frame", row.names = c(NA, 
    -10L))
    

    【讨论】:

      猜你喜欢
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 2016-07-27
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多