r在数据帧的1列中转换不同的日期时间格式

时间:2016-03-05 17:53:05

标签: r date datetime

我正在努力解决以下问题。我需要从多个目录导入多个.csv文件并将它们附加到数据框中。我想出了如何使用dir()lapply执行此操作。这是一个结果示例:

    structure(list(datetime = c("11/05/14 13:00", "11/05/14 13:30", 
"11/05/14 14:00", "11/05/14 14:30", "11/05/14 15:00", "02/08/12 08:32", 
"02/08/12 08:52", "02/08/12 09:12", "02/08/12 09:32", "02/08/12 09:52"
), file = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L)), class = "data.frame", row.names = c(NA, 
-10L), .Names = c("datetime", "file"))

         datetime file
1  11/05/14 13:00    1
2  11/05/14 13:30    1
3  11/05/14 14:00    1
4  11/05/14 14:30    1
5  11/05/14 15:00    1
6  02/08/12 08:32    2
7  02/08/12 08:52    2
8  02/08/12 09:12    2
9  02/08/12 09:32    2
10 02/08/12 09:52    2

上面,datetime是一个字符对象和文件整数。我希望将datetime转换为POSIXct。现在我面临的问题是第一个文件中的日期是dd / mm / yy,第二个文件中是mm / dd / yy。如何告诉R将所有dd / mm / yy和mm / dd / yy格式转换为posixct(yyyy / mm / dd)而不会混淆两种格式都有意义的日期?即11/05/14 13:00应转换为2014-05-11 13:00:00,并且02/08/12 08:32应该成为2012-02-08 08:32:00。需要说明的是,文件中只有1种格式,但文件之间只有多种格式。

我尝试使用lubridate包使用在线找到的解决方案。然而我意识到这个解决方案不区分格式,只是转换它可以做的任何事情。以下是我的剧本。

all_csv = dir(dir, recursive=TRUE, full.names=TRUE, pattern="\\.csv$")
    myfiles = lapply(all_csv, read.csv,sep=sep,dec=dec,stringsAsFactor=F,header=F,skip=2)

for(i in 1:length(myfiles)){
            library(lubridate)     
            mdy_hms1 <- mdy_hms(myfiles[[i]]$datetime, tz="US/Eastern")            
            dmy_hms1 <- dmy_hms(myfiles[[i]]$datetime, tz="US/Eastern")
            dmy_hms1[is.na(dmy_hms1)]<-mdy_hms1[is.na(dmy_hms1)]
            myfiles[[i]]$time<-dmy_hms1
    }

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

对于那些尝试实现类似功能的人,请尝试使用strsplit()。这允许您提取日期和时间组件,然后在提取的值&lt; = 12或&gt; 12时使用2 if循环。

threshold <- sapply(strsplit(as.character(myfiles[[1]]$time), '/'), function(x) x[1])

if(max(threshold) > 12){
      dmy_hms1 <- dmy_hms(myfiles[[i]]$time, tz=TZ)
      myfiles[[i]]$time<-dmy_hms1 # overwrite existing time column
    }

if(max(threshold) <=12){
  mdy_hms1 <- mdy_hms(myfiles[[i]]$time, tz=TZ)
  myfiles[[i]]$time<-mdy_hms1 # overwrite existing time column
}