2013-05-07 27 views
22

Ho un DataFrame con la colonna denominata date. Come possiamo convertire/analizzare la colonna 'data' in un oggetto DateTime?Analizza una colonna di Pandas a Datetime

Ho caricato la colonna della data da un database Postgresql utilizzando sql.read_frame(). Un esempio della colonna date è 2013-04-04.

Quello che sto cercando di fare è selezionare tutte le righe in un dataframe con le colonne della data entro un certo periodo, come dopo 2013-04-01 e prima dello 2013-04-04.

Il mio tentativo di sotto dà l'errore 'Series' object has no attribute 'read'

Tentativo

import dateutil 

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

errore

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) me la dà Errore di AttributeError: 'datetime.date' object has no attribute 'read'

df['date'].truncate(after='2013/04/01') dà l'errore TypeError: can't compare datetime.datetime to long

df['date'].dtype rendimenti dtype('O'). È già un oggetto datetime?

+1

Si prega di inviare un esempio di qualcosa nella colonna 'date'! Poiché i panda dovrebbero effettivamente riconoscere un oggetto datetime, sarebbe utile vedere il formato effettivo per quella colonna –

+0

@RyanSaxe Ho caricato la colonna della data da un database Postgresql usando 'sql.read_frame()'. Un esempio della colonna 'date' è' 2013-04-04'. Come si controlla il dtype di una colonna? – Nyxynyx

+0

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

risposta

4

panda legge già come oggetto datetime! Quindi, ciò che si vuole è quello di selezionare le righe tra due date e si può fare che con mascheramento:

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

Perché hai detto che si stavano diventando un errore dalla stringa per qualche ragione, provate questo:

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']' mi dà un errore 'TypeError: impossibile confrontare datetime.date con str'. – Nyxynyx

+1

Lo uso sempre! È molto strano ... la tua domanda è molto simile a quella che ho chiesto e mi è stata data questa risposta e ha funzionato. [Vedi qui] (http://stackoverflow.com/questions/16341367/grabbing-selection-between-specific-dates-in-a-dataframe) –

+0

Sì .. funziona quando ho creato manualmente il dataframe ... ma se creo il dataframe da un database SQL usando 'sql.read_frame',' '2012-01-01'' viene trattato come una stringa? – Nyxynyx

2

probabilmente avete bisogno apply, in modo da qualcosa come:

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

Senza un esempio della colonna Non posso garantire questo funzionerà, ma qualcosa in quella direzione Dovrebbe aiutare a portare avanti.

+0

Grazie, ho provato' df ['date']. Apply (dateutil.parser.parse) 'e ha dato ethe errore.'AttributeError: 'datetime.date' l'oggetto non ha attributo 'read''. Un esempio della colonna è "2013-04-04". L'intero dataframe è stato caricato da un database PostgreSQL usando 'sql.readframe()'. – Nyxynyx

1

Si dovrebbe scorrere gli articoli e analizzarli in modo indipendente, quindi creare un nuovo elenco.

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

Panda è a conoscenza del datetime dell'oggetto, ma quando si utilizza alcune delle funzioni di importazione viene preso come una stringa. Quindi, quello che devi fare è assicurarti che la colonna sia impostata come tipo datetime non come una stringa. Quindi puoi fare la tua richiesta.

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