我有一個存盤為字串的日期串列,我想將它們轉換為日期格式。我面臨兩個主要問題:
- 月-日-年分隔符不一致:有時是
_,有時是-。 - 字串中的月份和日期位置不一致:有時日期在月份之前,有時相反。
我想知道是否有一種方法可以將regex下面的所有三個字串都轉換為日期。
> mydate <- c('Jan_30_2018','April_3-2018','07_June_2018')
> as.Date(mydate,'%B_%d_%Y')
[1] "2018-01-30" NA NA
> as.Date(mydate,'%B.%d.%Y')
[1] NA NA NA
> as.Date(mydate,'%B*%d*%Y')
[1] NA NA NA
> as.Date(mydate,'%B %d %Y')
[1] NA NA NA
> as.Date(mydate,'%B_%d-%Y')
[1] NA "2018-04-03" NA
uj5u.com熱心網友回復:
正如@rawr在一小時前的評論中暗示的那樣,anydate()我的anytime包中的功能就是為此而設計的:
- 不需要格式字串,但會檢查一些可能且合理的字串
- 不需要向量的所有元素使用相同的格式
- 確實使用矢量化和編譯操作,所以它很快
例子
> anytime::anydate(c('Jan_30_2018','April_3-2018','07_June_2018'))
[1] "2018-01-30" "2018-04-03" "2018-06-07"
>
uj5u.com熱心網友回復:
as.Date(ifelse(grepl("^[A-Z]",mydate),
as.Date(gsub("_","-",mydate), "%B-%d-%Y"),
as.Date(gsub("_","-",mydate), "%d-%B-%Y")
), origin="1970-01-01")
[1] "2018-01-30" "2018-04-03" "2018-06-07"
更新
這種方法提供了一些不錯的速度,以防您的向量mydate具有任何合理的大小:
library(data.table)
data.table(d=gsub("_","-",mydate))[
, fifelse(grepl("^[A-Za-z]",d),as.Date(d,"%B-%d-%Y"), as.Date(d,"%d-%B-%Y"))]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/456815.html
上一篇:計算兩個時間戳之間的不同日期
