2013-11-15 14 views
6

Ho un dataframe Pandas come questo; (Ottenuta con il parsing di un file excel)Combina colonna data e ora in colonna datetime

|  |  COMPANY NAME   | MEETING DATE  | MEETING TIME| 
-----------------------------------------------------------------------| 
|YKSGR| YAPI KREDİ SİGORTA A.Ş. | 2013-12-16 00:00:00 |14:00:00  | 
|TRCAS| TURCAS PETROL A.Ş.  | 2013-12-12 00:00:00 |13:30:00  | 

Colonna MEETING DATE è un timestamp con una rappresentazione come Timestamp('2013-12-20 00:00:00', tz=None) e MEETING TIME è un oggetto datetime.time con una rappresentazione come datetime.time(14, 0)

voglio unire MEETING DATE e MEETING TIME in una sola colonna . datetime.combine sembra fare quello che voglio, tuttavia, ho bisogno di applicare questa funzione in qualche modo in termini di colonne. Come posso raggiungere questo obiettivo?

+0

Forse si potrebbe 'apply' la funzione (o anyfunction si vuole) a data dell'incontro e Meeting Time http : //pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.apply.html – dm03514

risposta

7

È possibile utilizzare il metodo applicare, e applicare combinano in questo modo:

>>> df.apply(lambda x: combine(x['MEETING DATE'], x['MEETING TIME']), axis=1) 
0 2013-12-16 14:00:00 
1 2013-12-12 13:00:00 
+0

Hey ero bloccato con un problema simile e ho provato questo - ma sto ottenendo un errore - combine() argomento 1 deve essere datetime.date, non Series. Immagino che combinare non prenda l'intera serie, solo un elemento alla volta. Come faccio a evitare questo? – pradeep

2

Altre soluzioni non ha funzionato per me, così mi si avvicinò con una soluzione utilizzando replace invece di combine:

def combine_date_time(df, datecol, timecol): 
    return df.apply(lambda row: row[datecol].replace(
     hour=row[timecol].hour, 
     minute=row[timecol].minute), 
     axis=1 
    ) 

Nel tuo caso:

combine_date_time(df, 'MEETING DATE', 'MEETING TIME') 

Si sente lento (ho non cronometrato correttamente), ma funziona.

UPDATE: Ho cronometrato entrambi gli approcci per un insieme di dati relativamente grande (> 500.000 righe), ed entrambi hanno tempi di esecuzione simile, ma utilizzando combine è più veloce (59s per replace vs 50 per combine). Inoltre, vedere la risposta jezrael al riguardo.

UPDATE2: Ho cercato l'approccio 's jezrael:

def combine_date_time(df, datecol, timecol): 
    return pd.to_datetime(df[datecol].dt.date.astype(str) 
          + ' ' 
          + df[timecol].astype(str)) 

Questo approccio è velocissimo in confronto, jezrael è giusto. Non sono stato in grado di misurarlo, ma è evidente.

+0

Aggiungo una soluzione più veloce, è possibile verificarla. – jezrael

+0

E quanto è veloce la mia soluzione? – jezrael

+0

@jezrael mi dispiace, non sono stato in grado di farlo funzionare. Non posso passarci del tempo adesso. Grazie per il contributo, però. – jabellcu

1

È possibile convertire Time colonna primo a string e poi to_timedelta, quindi è facile somma entrambe le colonne:

print (type(df['MEETING DATE'].iat[0])) 
<class 'pandas.tslib.Timestamp'> 

print (type(df['MEETING TIME'].iat[0])) 
<class 'datetime.time'> 

print (df['MEETING DATE'] + pd.to_timedelta(df['MEETING TIME'].astype(str))) 
YKSGR 2013-12-16 14:00:00 
TRCAS 2013-12-12 13:30:00 
dtype: datetime64[ns] 
Problemi correlati