2013-05-07 12 views
22

Ich habe eine DataFrame mit Spalte namens date. Wie können wir die Spalte "Datum" in ein Objekt DateTime konvertieren/analysieren?Parsen Sie eine Pandas-Spalte zu Datetime

Ich habe die Datumsspalte aus einer Postgresql-Datenbank mit sql.read_frame() geladen. Ein Beispiel für die Spalte date ist 2013-04-04.

Was ich versuche zu tun ist, alle Zeilen in einem Datenrahmen, die ihre Datumsspalten innerhalb einer bestimmten Zeit, wie nach 2013-04-01 und vor 2013-04-04 hat.

unter Mein Versuch gibt mir den Fehler gibt 'Series' object has no attribute 'read'

Versuch

import dateutil 

df['date'] = dateutil.parser.parse(df['date']) 

Fehler

AttributeError       Traceback (most recent call last) 
<ipython-input-636-9b19aa5f989c> in <module>() 
    15 
    16 # Parse 'Date' Column to Datetime 
---> 17 df['date'] = dateutil.parser.parse(df['date']) 
    18 
    19 # SELECT RECENT SALES 

C:\Python27\lib\site-packages\dateutil\parser.pyc in parse(timestr, parserinfo, **kwargs) 
    695   return parser(parserinfo).parse(timestr, **kwargs) 
    696  else: 
--> 697   return DEFAULTPARSER.parse(timestr, **kwargs) 
    698 
    699 

C:\Python27\lib\site-packages\dateutil\parser.pyc in parse(self, timestr, default, ignoretz, tzinfos, **kwargs) 
    299    default = datetime.datetime.now().replace(hour=0, minute=0, 
    300              second=0, microsecond=0) 
--> 301   res = self._parse(timestr, **kwargs) 
    302   if res is None: 
    303    raise ValueError, "unknown string format" 

C:\Python27\lib\site-packages\dateutil\parser.pyc in _parse(self, timestr, dayfirst, yearfirst, fuzzy) 
    347    yearfirst = info.yearfirst 
    348   res = self._result() 
--> 349   l = _timelex.split(timestr) 
    350   try: 
    351 

C:\Python27\lib\site-packages\dateutil\parser.pyc in split(cls, s) 
    141 
    142  def split(cls, s): 
--> 143   return list(cls(s)) 
    144  split = classmethod(split) 
    145 

C:\Python27\lib\site-packages\dateutil\parser.pyc in next(self) 
    135 
    136  def next(self): 
--> 137   token = self.get_token() 
    138   if token is None: 
    139    raise StopIteration 

C:\Python27\lib\site-packages\dateutil\parser.pyc in get_token(self) 
    66     nextchar = self.charstack.pop(0) 
    67    else: 
---> 68     nextchar = self.instream.read(1) 
    69     while nextchar == '\x00': 
    70      nextchar = self.instream.read(1) 

AttributeError: 'Series' object has no attribute 'read' 

df['date'].apply(dateutil.parser.parse) die Fehler AttributeError: 'datetime.date' object has no attribute 'read'

df['date'].truncate(after='2013/04/01') gibt dem Fehler TypeError: can't compare datetime.datetime to long

df['date'].dtype kehrt dtype('O'). Ist es schon ein datetime Objekt?

+1

Bitte geben Sie ein Beispiel für etwas in Ihrer Spalte "Datum" ein! Da Pandas tatsächlich ein Datetime-Objekt erkennen sollten, wäre es von Vorteil, das tatsächliche Format für diese Spalte zu sehen. –

+0

@RyanSaxe Ich habe die Datumsspalte mit 'sql.read_frame()' aus einer Postgresql-Datenbank geladen. Ein Beispiel für die Spalte "Datum" ist "2013-04-04". Wie prüfen Sie den Typ einer Spalte? – Nyxynyx

+0

'df ['date']. Dtype gibt 'dtype (' O ')' zurück – Nyxynyx

Antwort

4

Pandas liest bereits, dass als datetime Objekt! Also, was Sie wollen, ist Zeilen zwischen zwei Terminen zu wählen und Sie können durch Maskierung tun:

df_masked = df[(df.date > '2012-04-01') & (df.date < '2012-04-04')] 

Weil Sie gesagt, dass Sie einen Fehler aus der Zeichenfolge aus irgendeinem Grund wurden, versuchen Sie dies:

df_masked = df[(df.date > datetime.date(2012,4,1)) & (df.date < datetime.date(2012,4,4))] 
+1

'df = df [df.date> '2012-01-01']' gibt mir einen Fehler 'TypeError: kann datetime.date nicht mit str 'vergleichen. – Nyxynyx

+1

Ich benutze dies die ganze Zeit! Das ist sehr merkwürdig ... Ihre Frage ist sehr ähnlich zu der, die ich gestellt habe, und mir wurde diese Antwort gegeben und es hat funktioniert. [Siehe hier] (http://stackoverflow.com/questions/16341367/grabbing-selection-between-specific-dates-in-a-dataframe) –

+0

Ja .. es funktioniert, wenn ich den Datenrahmen manuell erstellt habe ... aber Wenn ich den Datenrahmen aus einer SQL-Datenbank mit 'sql.read_frame' erstelle, wird' '2012-01-01'' als String behandelt? – Nyxynyx

2

Sie müssen wahrscheinlich apply, so etwas wie:

df['date'] = df['date'].apply(dateutil.parser.parse) 

Ohne ein Beispiel der Spalte kann ich diese Arbeit nicht garantieren, aber etwas in dieser Richtung sollten Sie tragen helfen.

+0

Danke, ich habe 'df [' date ']. Apply (dateutil.parser.parse)' versucht und es gab den Fehler.'AttributeError: 'datetime.date' Objekt hat kein Attribut 'read''. Ein Beispiel für die Spalte ist "2013-04-04". Der gesamte Datenrahmen wurde mit 'sql.readframe()' aus einer PostgreSQL-Datenbank geladen. – Nyxynyx

1

Sie sollten über die Elemente iterieren und sie unabhängig analysieren und dann eine neue Liste erstellen.

44

Pandas kennt das Objekt datetime, aber wenn Sie einige der Importfunktionen verwenden, wird es als Zeichenfolge verwendet. Sie müssen also sicherstellen, dass die Spalte als Datetime-Typ nicht als Zeichenfolge festgelegt ist. Dann können Sie Ihre Anfrage stellen.

df['date'] = pd.to_datetime(df['date']) 
df_masked = df[(df['date'] > datetime.date(2012,4,1)) & (df['date'] < datetime.date(2012,4,4))]