2013-05-07 17 views
22

Mam DataFrame z kolumną o nazwie date. Jak możemy przekonwertować/przeanalizować kolumnę "date" do obiektu DateTime?Parsowanie pandy do Datetime

Załadowałem kolumnę z datą z bazy danych Postgresql, używając sql.read_frame(). Przykładem kolumny date jest 2013-04-04.

Co próbuję zrobić, to wybrać wszystkie wiersze w ramce danych, która ma ich kolumny daty w pewnym okresie, np. Po 2013-04-01 i przed 2013-04-04.

Moja próba poniżej daje błąd 'Series' object has no attribute 'read'

Próba

import dateutil 

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

błąd

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) daje mi Błąd AttributeError: 'datetime.date' object has no attribute 'read'

df['date'].truncate(after='2013/04/01') daje błąd TypeError: can't compare datetime.datetime to long

df['date'].dtype powraca dtype('O'). Czy to już obiekt datetime?

+1

Proszę napisać przykład czegoś w swojej kolumnie "Data"! Ponieważ pandy powinny faktycznie rozpoznać obiekt datetime, więc byłoby dobrze zobaczyć faktyczny format dla tej kolumny –

+0

@RyanSaxe. Załadowałem kolumnę daty z bazy danych Postgresql, używając 'sql.read_frame()'. Przykładem kolumny 'date' jest' 2013-04-04'. Jak sprawdzić typ kolumny? – Nyxynyx

+0

'df ['date']. Dtype' zwraca' dtype ('O') ' – Nyxynyx

Odpowiedz

4

pandy już to czyta jako obiekt datetime! Więc to, co chcesz, aby wybrać wiersze między dwiema datami i można to zrobić poprzez maskowanie:

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

Bo mówiłeś, że jesteś uzyskiwanie błąd z łańcucha z jakiegoś powodu, spróbuj tego:

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']' daje mi błąd 'TypeError: nie można porównać datetime.date do str'. – Nyxynyx

+1

Używam tego cały czas! To bardzo dziwne ... twoje pytanie jest bardzo podobne do tego, o które prosiłem i dostałem tę odpowiedź i zadziałało. [Zobacz tutaj] (http://stackoverflow.com/questions/16341367/grabbing-selection-between-specific-dates-in-a-dataframe) –

+0

Tak ... działa, gdy ręcznie utworzyłem ramkę danych ... ale jeśli utworzyć ramkę danych z bazy danych SQL za pomocą 'sql.read_frame',' '2012-01-01'' zostanie potraktowany jako ciąg znaków? – Nyxynyx

2

Prawdopodobnie trzeba apply, więc coś takiego:

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

Bez przykład kolumny nie mogę zagwarantować, to będzie działać, ale coś w tym kierunku powinny pomóc na prowadzenie.

+0

Dzięki, próbowałem' df ['date']. Apply (dateutil.parser.parse) 'i dał błąd ethe.'AttributeError: 'datetime.date' obiekt nie ma atrybutu" czytaj ". Przykładem kolumny jest "2013-04-04". Cała ramka danych została załadowana z bazy danych PostgreSQL za pomocą 'sql.readframe()'. – Nyxynyx

1

Powinieneś powtórzyć elementy i przeanalizować je niezależnie, a następnie skonstruować nową listę.

df['date'] = [dateutil.parser.parse(x) for x in df['date']] 
44

Pandy są świadome datetime obiektu, ale podczas korzystania z niektórych funkcji importowania jest traktowane jako ciąg znaków. Musisz więc upewnić się, że kolumna jest ustawiona jako typ datetime, a nie jako ciąg. Następnie możesz utworzyć zapytanie.

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