如何将许多日期时间格式转换为一种格式

时间:2017-05-22 10:54:23

标签: r

我的dt中有一列Dataframe,如下所示

dt

01-Jan-2017 12:00:00
12/01/2017   01:15:00
13-Sep-97    21:00:00
20 August 2017 22:00:00
12/19/17   01:15:00
2/4/2017    05:18:00

如何在R_dt列中获取R日期时间格式

   dt                         R_dt
01-Jan-2017 12:00:00         2017-01-01 12:00:00
12/01/2017   01:15:00        2017-12-01 01:15:00
13-Sep-97    21:00:00        1997-09-13 21:00:00
20 August 2017 22:00:00      2017-08-20 22:00:00
12/19/17   01:15:00          2017-12-19 01:15:00
2/4/2017    05:18:00         2017-02-04 05:18:00

我尝试过使用 - strftime(mydf$date,"%d/%m/%Y") - 这会引发错误。

1 个答案:

答案 0 :(得分:2)

您有多种格式,需要一个自动尝试多种格式的功能。我的anytime包中的anytime()就是这样一个功能:

R> dvec <- c("01-Jan-2017 12:00:00", "12/01/2017 01:15:00", "13-Sep-97 21:00:00", 
=            "20 August 2017 22:00:00", "12/19/17 01:15:00", "2/4/2017 05:18:00")
R> dvec
[1] "01-Jan-2017 12:00:00"    "12/01/2017 01:15:00"    
[3] "13-Sep-97 21:00:00"      "20 August 2017 22:00:00"
[5] "12/19/17 01:15:00"       "2/4/2017 05:18:00"      
R> anytime(dvec)
[1] "2017-01-01 12:00:00 CST" "2017-12-01 01:15:00 CST"
[3] NA                        "2017-08-20 22:00:00 CDT"
[5] NA                        NA                       
R> 

您看到三个失败:两个使用两位数的年份(格式%y),默认情况下我们不支持 - 但我们提供了通过addFormat()添加格式的功能所以可以解决这个问题:

R> addFormats(c("%d-%b-%y %H:%M:%S", "%m/%d/%y %H:%M:%S"))
R> anytime(dvec)
[1] "2017-01-01 12:00:00 CST" "2017-12-01 01:15:00 CST"
[3] "2097-09-13 21:00:00 CDT" "2017-08-20 22:00:00 CDT"
[5] "2017-12-19 01:15:00 CST" NA                       
R> 

最后一个因为单个数字月份和日期而失败 - 而且我们使用的Boost代码没有对其进行解析,所以我没有(简单)修复它。

但是,由于与测试和比较相关的原因,我们现在还允许使用R的内部解析器(通过我的包RApiDatetime),以便您可以对这些进行后处理:

R> anytime(dvec[6], useR=TRUE)
[1] "2017-02-04 05:18:00 CST"
R>