2017-12-21 15 views
0

Ich bin neu in R und habe viel mit diesem Problem gekämpft. Versucht, eine Lösung über verschiedene Orte hinweg zu finden, konnte dies aber nicht.
Ich habe einen Ordner mit mehreren CSV-Dateien (etwa 158). Jeder CSV hat eine Spalte mit Datum und Uhrzeit. Ich fand heraus, dass das Format des Datums in csv-Dateien nicht Standard ist, was meine Analysen durcheinander bringt. Beispiel:Importieren von CSV-Dateien mit Datum und Uhrzeit Spalte in verschiedenen Formaten in R: gibt es eine Möglichkeit, es zu standardisieren?

>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 

Ich machte die folgende Schleife, um die Dateien zu binden.

>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 

Was ich denke,: Ich vermute, dass es einen Weg geben muss das Format der Date.Time Spalte in der Schleife eines jeden csv vor dem Binden sie zu standardisieren. Das heißt, ich denke ich muss das vor mir machen do.call(rbind,theList), aber nicht sicher wie (oder wenn es möglich ist). Formatieren jeder CSV-Datei in Excel wäre ein Schmerz in den Arsch, so würde ich einige Hilfe zu schätzen wissen: P.

+1

Warum können Sie nicht nur lubridate- oder intellidate-Pakete auf "theResult $ Date.Time" verwenden? – Dan

+0

Ja ... vorher. Verwenden Sie as.POSIXct mit Format = "% m /% d /% y% I:% M:% S% p" in einem Fall und "% d /% m /% y% I:% M:% S% p" im anderen Fall. Lies '? Strptime'. Möglich, dass das 'allzeit'-Paket von Wert sein könnte. –

+1

Danke @Dan, ich weiß es zu schätzen. Nachdem ich das 'lubridate'-Paket gegraben hatte, benutzte ich die Funktion' parse_date_time' - bekam auch Hilfe von diesem: (https://stackoverflow.com/questions/26064292/guess-formats-r-lubridate). Ich werde meine Lösung posten. –

Antwort

1

Need richtiges Format Strings aus der ?strptime Hilfeseite zu verwenden:

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") 

Das entfettete Format für Datum Zeiteingabe ist YYYY-MM-DD HH: MM: SS im 24-Stunden Zeit. Wenn Sie einen AM/PM-Indikator haben, müssen Sie die% I 12-Stunden-Formatspezifikation verwenden.

> 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 

Dann do.call(rbind, list(file1,file2)) benutzen Sie:

   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

Vielen Dank @ 42-. Lösungen sind sehr hilfreich. Speziell der Teil über 12h Format. Problem ist, dass es mehrere Dateien gibt und ich nicht, was im Format mm/dd oder dd/mm ist. Meine Lösung hat funktioniert –

2

Könnte es richtig machen, indem eine zusätzliche Codezeile in nach read.csv Zugabe mit parse_date_time Funktion in lubridate Paket, wie empfohlen.

>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) 

Meine Vermutung ist, dass R herausfinden konnte, wenn es mdy oder dmy basierend auf dem orders Argument in parse_date_time hätte sein sollen.

Verwandte Themen