2013-07-30 2 views
5

У меня есть поле dataframe, data['time taken'];Преобразование hh: mm: ss to minutes using python pandas

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

Как получить выходные данные в виде минут, как показано ниже?

128 
125 
175 
222 
72 
106 
202 
216 
+0

какой тип данных это (какого типа эти времена)? –

+0

Мне было предложено сделать это на основе проблемы, которая у меня была; 'data ['time taken'] = data ['time taken']. apply (pd.lib.repr_timedelta64)' – richie

+0

Вы вдохновили эту проблему: https://github.com/pydata/pandas/issues/ 4378 (Это проблема, сейчас у нас нет обратного решения), поэтому сохранение как int64 будет намного быстрее (хотя и не так красиво) – Jeff

ответ

4

Вы могли бы попытаться преобразовать его в 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

Хотя это довольно аккуратное решение, оно значительно медленнее чем использовать 'str.split'. –

+0

Да, str.split должен быть быстрее. – waitingkuo

5

Предполагая, что это столбец строка, которую вы можете использовать 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 

, а затем использовать 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

Немного Hacky как мы напрямую не поддерживают чтение в 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

Преобразование из строки в дату-время, кажется, большие накладные расходы, хотя и приятнее. –

+0

yep .... это сделало бы намного быстрее (эффективно иметь to_datetime разобрать timedeltas), не так сложно: https://github.com/pydata/pandas/issues/4378 – Jeff

Смежные вопросы