2013-01-22 13 views
7

Ich habe etwas unerwartetes während der Arbeit mit der Funktion strptime() aufgetreten. Das Format des Datums, das ich habe, besteht aus "22.01.2013 11:00:00 P.M". Das Format, das ich dafür verwende, ist "% m /% d /% Y% I:% M:% S% p".AM/PM Zeichenfolge wird nicht korrekt von strptime erkannt

Der Code ist wie folgt.

strptime("1/22/2013 11:00:00 p.m",format="%m/%d/%Y %I:%M:%S %p") 
[1] NA 

aber wenn ich

strptime("1/22/2013 11:00:00 pm",format="%m/%d/%Y %I:%M:%S %p") 
[1] "2013-01-22 23:00:00" 

verwenden bekomme ich das entsprechende Ergebnis.

So fehlt es dieser Eigenschaft in Strptime zu erkennen, p.m und seine Variationen wie p.m. usw. anstelle von PM oder PM. Ist das ein Fehler in R?

Die Version von R Ich verwende R.14.2 auf Windows 7 32-bit

+4

Bitte ** sehr ** vorsichtig über die Kennzeichnung Verhalten als "Bugs" in allen gängigen Sprachen. Es ist immer verlockend, Software zu beschuldigen, vor allem ein neues Paket, mit dem wir nicht vertraut sind, aber in der Tat sind diese Art von Problemen praktisch nie Fehler. (Es sei denn, es ist SAP, natürlich :-)) –

Antwort

11

Das ist kein Fehler, sondern strptime erwartet, dass die Informationen in standardisierter Form. %p ist:

AM/PM Indikator im Gebietsschema. Wird in Verbindung mit '% I' und nicht mit '% H' verwendet. Eine leere Zeichenfolge in einigen Ländereinstellungen.

In Ihrem Gebietsschema ist dies definiert als AM/am und PM/pm. R ist eine formale Sprache, und Sie müssen sich an die Regeln halten, die es auferlegt. Wenn Sie einen Faktor mit den Ebenen flavor, color, taste definieren, können Sie nicht erwarten, colour und flavour als Möglichkeiten zu verwenden, auf diesen Faktor zu verweisen. Obwohl es für Sie offensichtlich ist, dass diese das gleiche Konzept darstellen, ist R eine formale Sprache ohne menschliche Flexibilität.

+2

um die Perioden loszuwerden: 'gsub (" [.] "," \\ 1 "," 22.01.2013 11:00:00 Uhr ")' – Michael

2
library(lubridate) 
mdy_hms("01/22/2013 11:00:00 PM") 

Das Ergebnis:

[1] "2013-01-22 11:00:00 UTC" 
+2

Falls jemand sich wundern sollte, scheint diese Antwort das Paket "lubridate" zu verwenden – andrechalom