2017-12-21 19 views
0

저는 R에 익숙하지 않아이 문제로 많은 어려움을 겪고 있습니다. 여러 곳의 솔루션을 찾으려고했으나 시도 할 수 없었습니다.
여러 개의 CSV 파일 (약 158 개)이 포함 된 폴더가 있습니다. 각 csv에는 날짜와 시간이 포함 된 열이 있습니다. 나는 날짜의 형식이 CSV 파일 전체에 표준이 아니므로 분석을 망쳤다. 예 :날짜와 시간 열이있는 CSV 파일을 R의 다른 형식으로 가져 오기 : 표준화하는 방법이 있습니까?

>head(file1) # date format is in MONTH/day/year 
     DateTime   Value 
    6/2/14 11:00:01 PM 24.111 
    6/3/14 1:30:01 AM 21.61 
    6/3/14 4:00:01 AM 20.609 

>head(file2) # date format is in day/MONTH/year 
DateTime Value 
03/06/14 1:30:01 AM 21.588 
03/06/14 4:00:01 AM 20.086 
03/06/14 6:30:01 AM 18.584 

파일을 바인드하기 위해 다음 루프를 만들었습니다.

>files.names<-list.files(getwd(),pattern="*.csv") 
>theList <- lapply(files.names,function(x){ 
> theData <- read.csv(x,skip=18) }) 
>theResult <- do.call(rbind,theList) 
>head(theResult) 
       Date.Time Value 
1 6/2/14 11:00:01 PM  24.111 
2 6/3/14 1:30:01 AM  21.610 
3 6/3/14 4:00:01 AM  20.609 
4 6/3/14 6:30:01 AM  19.107 
5 6/3/14 9:00:01 AM  19.608 
6 6/3/14 11:30:01 AM  20.609 

내 생각은 무엇 : 내가 그들을 결합하기 전에 각 CSV의 루프에서 Date.Time 칼럼의 형식을 표준화 할 수있는 방법이있을 것으로 추측하고있다. 즉, 내가 전에 do.call(rbind,theList)을해야하지만, 확실하지 않은 것 같아요 (또는 가능한 경우). Excel에서 각 CSV 파일의 서식을 지정하는 것이 엉덩이의 고통 일 수 있으므로 도움을 받으시기 바랍니다. P. ?strptime 도움말 페이지에서 적절한 형식 문자열을 사용하는

+1

"theResult $ Date.Time"에 왜 lubridate 또는 intellidate 패키지를 사용할 수 없습니까? – Dan

+0

예 ... 전에. "% d/% m/% y % I : % M : % S % p"와 함께 asformat = "% m/% d/% y % I : % M : % S % 다른 경우에는 '? strptime'을 읽으십시오. 'anytime' 패키지가 중요 할 수도 있습니다. –

+1

감사합니다. @ 단, 고맙습니다. 'lubridate' 패키지를 파헤 쳐서'parse_date_time' 함수를 사용하여 끝냈습니다 - (https://stackoverflow.com/questions/26064292/guess-formats-r-lubridate)도 도움이되었습니다. 나는 나의 해결책을 게시 할 것이다. –

답변

1

필요 : MM : 24 시간 시간 SS 날짜 - 시간 입력

file1$DateTime <- as.POSIXct(file1$DateTime , format="%m/%d/%y %I:%M:%S %p") 
file2$DateTime <- as.POSIXct(file1$DateTime , format="%d/%m/%y %I:%M:%S %p") 

탈지 형식은 YYYY-MM-DD HH이다. 오전/오후 표시기가있는 경우 % I 12 시간 형식 사양을 사용해야합니다.

> file1 
      DateTime Value 
1 2014-06-02 23:00:01 24.111 
2 2014-06-03 01:30:01 21.610 
3 2014-06-03 04:00:01 20.609 
> file2 
      DateTime Value 
1 2014-06-02 23:00:01 21.588 
2 2014-06-03 01:30:01 20.086 
3 2014-06-03 04:00:01 18.584 

그런 얻을 수 do.call(rbind, list(file1,file2))를 사용

   DateTime Value 
1 2014-06-02 23:00:01 24.111 
2 2014-06-03 01:30:01 21.610 
3 2014-06-03 04:00:01 20.609 
4 2014-06-02 23:00:01 21.588 
5 2014-06-03 01:30:01 20.086 
6 2014-06-03 04:00:01 18.584 
+0

고맙습니다. @ 42-. 솔루션은 매우 유용합니다. 특히 12h 포맷에 관한 부분. 문제는 여러 개의 파일이 있는데 mm/dd 또는 dd/mm 형식으로되어 있지 않습니다. 내 솔루션이 작동했습니다. –

2

이 그것을 얻을 수 권리 권장, lubridate 패키지에 parse_date_time 기능을 사용 후 read.csv 코드의 여분의 줄을 추가하여.

>files.names<-list.files(getwd(),pattern="*.csv") 
>theList <- lapply(files.names,function(x){ 
>theData <- read.csv(x,skip=18) 
>theData$Date.Time<-parse_date_time(x = theData$Date.Time, 
      orders = c("mdy HMS %p", "dmy HMS %p"), local = eng") }) ###extra line 
>theResult <- do.call(rbind,theList) 

내 생각은 parse_date_timeorders 인수에 따라 mdy 또는 dmy을 했어야 경우에 R 알아낼 수 있다는 것입니다.