2013-07-30 28 views
5

Ho una colonna dataframe, data['time taken'];Converti hh: mm: ss in minuti usando panda pitone

02:08:00 
02:05:00 
02:55:00 
03:42:00 
01:12:00 
01:46:00 
03:22:00 
03:36:00 

Come si ottiene l'output in forma di minuti come indicato di seguito?

128 
125 
175 
222 
72 
106 
202 
216 
+0

quale tipo di dati è questo (che tipo sono questi tempi)? –

+0

Mi è stato suggerito di farlo in base a un problema che avevo; 'data ['time taken'] = data ['time taken'] .applica (pd.lib.repr_timedelta64)' – richie

+0

sei tu quello che ha ispirato questo problema: https://github.com/pydata/pandas/issues/ 4378 (Questo è il problema, non abbiamo una soluzione inversa a questo momento), ecco perché mantenere int64 sarà molto più veloce (anche se non così bello) – Jeff

risposta

4

Si potrebbe provare a convertirlo in DatetimeIndex

In [58]: time = pd.DatetimeIndex(df['time taken']) 

In [59]: time.hour * 60 + time.minute 
Out[59]: array([128, 125, 175, 222, 72, 106, 202, 216], dtype=int32) 
+0

Anche se questa è una soluzione abbastanza accurata, è molto più lenta che usando 'str.split'. –

+0

Sì, str.split dovrebbe essere più veloce. – waitingkuo

5

Supponendo che questo è una colonna di stringa è possibile utilizzare il metodo str.split:

In [11]: df['time taken'].str.split(':') 
Out[11]: 
0 [02, 08, 00] 
1 [02, 05, 00] 
2 [02, 55, 00] 
3 [03, 42, 00] 
4 [01, 12, 00] 
5 [01, 46, 00] 
6 [03, 22, 00] 
7 [03, 36, 00] 
Name: time taken, dtype: object 

e quindi utilizzare apply:

In [12]: df['time taken'].str.split(':').apply(lambda x: int(x[0]) * 60 + int(x[1])) 
Out[12]: 
0 128 
1 125 
2 175 
3 222 
4  72 
5 106 
6 202 
7 216 
Name: time taken, dtype: int64 
2

Un po 'hacky come noi non sosteniamo direttamente la lettura in timedeltas ATM

In [9]: df = read_csv(StringIO(data),header=None) 

In [10]: df 
Out[10]: 
      0 
0 02:08:00 
1 02:05:00 
2 02:55:00 
3 03:42:00 
4 01:12:00 
5 01:46:00 
6 03:22:00 
7 03:36:00 
Name: time, dtype: datetime64[ns] 

In [13]: df['time'] = pd.to_datetime(df['time']) 

In [18]: df['delta'] = df['time']-Timestamp('today') 

In [19]: df 
Out[19]: 
       time delta 
0 2013-07-30 02:08:00 02:08:00 
1 2013-07-30 02:05:00 02:05:00 
2 2013-07-30 02:55:00 02:55:00 
3 2013-07-30 03:42:00 03:42:00 
4 2013-07-30 01:12:00 01:12:00 
5 2013-07-30 01:46:00 01:46:00 
6 2013-07-30 03:22:00 03:22:00 
7 2013-07-30 03:36:00 03:36:00 

In [20]: df.dtypes 
Out[20]: 
time  datetime64[ns] 
delta timedelta64[ns] 
dtype: object 

In [22]: df['delta'].apply(lambda x: x/np.timedelta64(1,'m')) 
Out[22]: 
0 128 
1 125 
2 175 
3 222 
4  72 
5 106 
6 202 
7 216 
Name: delta, dtype: float64 
+0

La conversione da stringa a datetime sembra essere un grande overhead, anche se più bello. –

+0

sì .... questo renderebbe molto più veloce (efficacemente dover_datetime analizzare i timedeltas), non così difficile: https://github.com/pydata/pandas/issues/4378 – Jeff

Problemi correlati