Combina le colonne Data e Ora usando i panda python


113

Ho un dataframe panda con le seguenti colonne;

Date              Time
01-06-2013      23:00:00
02-06-2013      01:00:00
02-06-2013      21:00:00
02-06-2013      22:00:00
02-06-2013      23:00:00
03-06-2013      01:00:00
03-06-2013      21:00:00
03-06-2013      22:00:00
03-06-2013      23:00:00
04-06-2013      01:00:00

Come combino i dati ["Data"] e i dati ["Ora"] per ottenere quanto segue? C'è un modo per farlo usando pd.to_datetime?

Date
01-06-2013 23:00:00
02-06-2013 01:00:00
02-06-2013 21:00:00
02-06-2013 22:00:00
02-06-2013 23:00:00
03-06-2013 01:00:00
03-06-2013 21:00:00
03-06-2013 22:00:00
03-06-2013 23:00:00
04-06-2013 01:00:00

Grazie per tutte le risposte. Ho provato la maggior parte di loro, ma ancora quando aggiungo queste informazioni datetime come parte di un dataframe più grande. La colonna datetime visualizza solo la data e le informazioni sull'ora non vengono visualizzate. Dobbiamo capire che il tempo è nascosto lì o viene rimosso?
karthikeyan

Risposte:


169

Vale la pena ricordare che potresti essere stato in grado di leggerlo direttamente, ad esempio se stavi usando read_csvusing parse_dates=[['Date', 'Time']].

Supponendo che queste siano solo stringhe potresti semplicemente aggiungerle insieme (con uno spazio), permettendoti di applicare to_datetime:

In [11]: df['Date'] + ' ' + df['Time']
Out[11]:
0    01-06-2013 23:00:00
1    02-06-2013 01:00:00
2    02-06-2013 21:00:00
3    02-06-2013 22:00:00
4    02-06-2013 23:00:00
5    03-06-2013 01:00:00
6    03-06-2013 21:00:00
7    03-06-2013 22:00:00
8    03-06-2013 23:00:00
9    04-06-2013 01:00:00
dtype: object

In [12]: pd.to_datetime(df['Date'] + ' ' + df['Time'])
Out[12]:
0   2013-01-06 23:00:00
1   2013-02-06 01:00:00
2   2013-02-06 21:00:00
3   2013-02-06 22:00:00
4   2013-02-06 23:00:00
5   2013-03-06 01:00:00
6   2013-03-06 21:00:00
7   2013-03-06 22:00:00
8   2013-03-06 23:00:00
9   2013-04-06 01:00:00
dtype: datetime64[ns]

Nota: sorprendentemente (per me), questo funziona bene con NaN convertito in NaT, ma vale la pena preoccuparsi che la conversione (magari usando l' raiseargomento).


6
Non conoscono la funzione automatica di combinazioni, e funziona con più voci anche, come: parse_dates=[['Start date', 'Start time'], ['End date', 'End time']]). Panda <3
5agado

43

La risposta accettata funziona per colonne di tipo dati string. Per completezza: mi sono imbattuto in questa domanda durante la ricerca di come farlo quando le colonne sono di tipi di dati: data e ora.

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']),1)

2
Non riesco a trovare nulla per quanto riguarda il timedtype, nei panda. Ho piuttosto una timedelta(e una datetime), nel qual caso devi solo aggiungerle, vedi la mia risposta
toto_tico

Quando "pd.read_excel" una colonna di Excel che Excel identifica come "Ora", i panda la leggono automaticamente anche come "Ora" senza che sia richiesto alcun argomento di analisi. Grazie per questa soluzione. +1
Saeed

1
Solo una nota, a partire da pandas 1.0.0 pd.datetime è stato deprecato e si suggerisce invece di importare esplicitamente il datetimemodulo.
CopOnTheRun

16

Puoi usarlo per unire data e ora nella stessa colonna di dataframe.

import pandas as pd    
data_file = 'data.csv' #path of your file

Lettura del file .csv con colonne unite Date_Time:

data = pd.read_csv(data_file, parse_dates=[['Date', 'Time']]) 

Puoi usare questa riga per mantenere anche entrambe le altre colonne.

data.set_index(['Date', 'Time'], drop=False)

1
Puoi anche usare personalizzato date_parser, ad esempioparser = lambda date: pd.datetime.strptime(date, '%d-%b-%y %H:%M:%S')
Serendipity

11

Puoi eseguire il cast delle colonne se i tipi sono diversi (datetime e timestamp o str) e utilizzare to_datetime:

df.loc[:,'Date'] = pd.to_datetime(df.Date.astype(str)+' '+df.Time.astype(str))

Risultato:

0   2013-01-06 23:00:00
1   2013-02-06 01:00:00
2   2013-02-06 21:00:00
3   2013-02-06 22:00:00
4   2013-02-06 23:00:00
5   2013-03-06 01:00:00
6   2013-03-06 21:00:00
7   2013-03-06 22:00:00
8   2013-03-06 23:00:00
9   2013-04-06 01:00:00

Migliore,


10

Non ho abbastanza reputazione per commentare jka.ne quindi:

Ho dovuto modificare la riga di jka.ne perché funzionasse:

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']).time(),1)

Questo potrebbe aiutare gli altri.

Inoltre, ho testato un approccio diverso, utilizzando replaceinvece 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)

che nel caso del PO sarebbe:

combine_date_time(df, 'Date', 'Time')

Ho cronometrato entrambi gli approcci per un set di dati relativamente grande (> 500.000 righe) ed entrambi hanno tempi di esecuzione simili, ma l'utilizzo combineè più veloce (59 s per replacevs 50 s per combine).


5

La risposta dipende davvero da quali sono i tipi di colonna . Nel mio caso, ho avuto datetimee timedelta.

> df[['Date','Time']].dtypes
Date     datetime64[ns]
Time    timedelta64[ns]

Se questo è il tuo caso, devi solo aggiungere le colonne:

> df['Date'] + df['Time']

La risposta accettata presuppone stringhe: "Supponendo che queste siano solo stringhe, potresti semplicemente aggiungerle insieme (con uno spazio)" . Le mie risposte sono per datetimee timedelta. La risposta principale in qualche modo ha scoperto che le colonne erano stringhe, o forse era solo la risposta che ha funzionato per quella che ha pubblicato la domanda.
toto_tico

4

Puoi anche convertire in datetimesenza concatenazione di stringhe, combinando datetimee timedeltaoggetti. In combinazione con pd.DataFrame.pop, puoi rimuovere la serie sorgente contemporaneamente:

df['DateTime'] = pd.to_datetime(df.pop('Date')) + pd.to_timedelta(df.pop('Time'))

print(df)

             DateTime
0 2013-01-06 23:00:00
1 2013-02-06 01:00:00
2 2013-02-06 21:00:00
3 2013-02-06 22:00:00
4 2013-02-06 23:00:00
5 2013-03-06 01:00:00
6 2013-03-06 21:00:00
7 2013-03-06 22:00:00
8 2013-03-06 23:00:00
9 2013-04-06 01:00:00

print(df.dtypes)

DateTime    datetime64[ns]
dtype: object

1
Ottima soluzione generale! Ho digitato datetime date e tipo str time e ha funzionato.
passero

3

Per prima cosa assicurati di avere i giusti tipi di dati:

df["Date"] = pd.to_datetime(df["Date"])
df["Time"] = pd.to_timedelta(df["Time"])

Quindi li combini facilmente:

df["DateTime"] = df["Date"] + df["Time"]

2

Usa la combinefunzione:

datetime.datetime.combine(date, time)

2

Il mio set di dati aveva dati di risoluzione di 1 secondo per alcuni giorni e l'analisi con i metodi suggeriti qui era molto lenta. Invece ho usato:

dates = pandas.to_datetime(df.Date, cache=True)
times = pandas.to_timedelta(df.Time)
datetimes  = dates + times

Si noti che l'uso di cache=Truerende l'analisi delle date molto efficiente poiché ci sono solo un paio di date uniche nei miei file, il che non è vero per una colonna di data e ora combinata.


Questo è quello che farei.
Yaakov Bressler

1

DATI:

<TICKER>, <PER>, <DATE>, <TIME> , <OPEN>, <HIGH>, <LOW>, <CLOSE>, <VOL> SPFB.RTS, 1, 20190103,100100 , 106580.0000000,107260.0000000,106570.0000000 , 107230.0000000,3726

CODICE:

data.columns = ['ticker', 'per', 'date', 'time', 'open', 'high', 'low', 'close', 'vol']    
data.datetime = pd.to_datetime(data.date.astype(str) + ' ' + data.time.astype(str), format='%Y%m%d %H%M%S')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.