2016-08-09 4 views
2

У меня есть dataframe как этоткак конвертировать (возможно, отрицательный) Pandas TimeDelta в минутах (поплавок)?

df[['timestamp_utc','minute_ts','delta']].head() 
Out[47]: 
      timestamp_utc   minute_ts     delta 
0 2015-05-21 14:06:33.414 2015-05-21 12:06:00 -1 days +21:59:26.586000 
1 2015-05-21 14:06:33.414 2015-05-21 12:07:00 -1 days +22:00:26.586000 
2 2015-05-21 14:06:33.414 2015-05-21 12:08:00 -1 days +22:01:26.586000 
3 2015-05-21 14:06:33.414 2015-05-21 12:09:00 -1 days +22:02:26.586000 
4 2015-05-21 14:06:33.414 2015-05-21 12:10:00 -1 days +22:03:26.586000 

Где df['delta']=df.minute_ts-df.timestamp_utc

timestamp_utc  datetime64[ns] 
minute_ts   datetime64[ns] 
delta   timedelta64[ns] 

проблема, я хотел бы получить число (возможно, отрицательные) минут между timestamp_utc и minutes_ts, пренебрегая секунд компонент.

Итак, для первого ряда я хотел бы получить -120. Действительно, 2015-05-21 12:06:00 составляет 120 минут до 2015-05-21 14:06:33.414.

Что такое самый пандачный способ сделать это?

Большое спасибо!

ответ

1

Вы можете использовать:

df['a'] = df['delta']/np.timedelta64(1, 'm') 
print (df) 
      timestamp_utc   minute_ts     delta \ 
0 2015-05-21 14:06:33.414 2015-05-21 12:06:00 -1 days +21:59:26.586000 
1 2015-05-21 14:06:33.414 2015-05-21 12:07:00 -1 days +22:00:26.586000 
2 2015-05-21 14:06:33.414 2015-05-21 12:08:00 -1 days +22:01:26.586000 
3 2015-05-21 14:06:33.414 2015-05-21 12:09:00 -1 days +22:02:26.586000 
4 2015-05-21 14:06:33.414 2015-05-21 12:10:00 -1 days +22:03:26.586000 

      a 
0 -120.5569 
1 -119.5569 
2 -118.5569 
3 -117.5569 
4 -116.5569 

А затем конвертировать float в int:

df['a'] = (df['delta']/np.timedelta64(1, 'm')).astype(int) 
print (df) 
      timestamp_utc   minute_ts     delta a 
0 2015-05-21 14:06:33.414 2015-05-21 12:06:00 -1 days +21:59:26.586000 -120 
1 2015-05-21 14:06:33.414 2015-05-21 12:07:00 -1 days +22:00:26.586000 -119 
2 2015-05-21 14:06:33.414 2015-05-21 12:08:00 -1 days +22:01:26.586000 -118 
3 2015-05-21 14:06:33.414 2015-05-21 12:09:00 -1 days +22:02:26.586000 -117 
4 2015-05-21 14:06:33.414 2015-05-21 12:10:00 -1 days +22:03:26.586000 -116 
+0

спасибо jezrael, но вы видите 'a' все еще содержит секундную часть. Я просто хочу -120, а не -120.5569 –

+1

никаких проблем, дайте мне сек. – jezrael

+0

hehehe вы слишком быстро –

1

Вы можете использовать Timedelta object в панд, а затем использовать пол разделение в списке понимание для расчета минут , Обратите внимание, что свойство seconds из Timedelta возвращает количество секунд (> = 0 и менее 1 дня), так что вы должны явно конвертировать дни в соответствующие минуты.

df = pd.DataFrame({'minute_ts': [pd.Timestamp('2015-05-21 12:06:00'), 
           pd.Timestamp('2015-05-21 12:07:00'), 
           pd.Timestamp('2015-05-21 12:08:00'), 
           pd.Timestamp('2015-05-21 12:09:00'), 
           pd.Timestamp('2015-05-21 12:10:00')], 
        'timestamp_utc': [pd.Timestamp('2015-05-21 14:06:33.414')] * 5}) 

df['minutes_neg'] = [td.days * 24 * 60 + td.seconds//60 
       for td in [pd.Timedelta(delta) 
          for delta in df.minute_ts - df.timestamp_utc]] 

df['minutes_pos'] = [td.days * 24 * 60 + td.seconds//60 
       for td in [pd.Timedelta(delta) 
          for delta in df.timestamp_utc - df.minute_ts]] 

>>> df 
      minute_ts   timestamp_utc minutes_neg minutes_pos 
0 2015-05-21 12:06:00 2015-05-21 14:06:33.414   -121   120 
1 2015-05-21 12:07:00 2015-05-21 14:06:33.414   -120   119 
2 2015-05-21 12:08:00 2015-05-21 14:06:33.414   -119   118 
3 2015-05-21 12:09:00 2015-05-21 14:06:33.414   -118   117 
4 2015-05-21 12:10:00 2015-05-21 14:06:33.414   -117   116 

Обратите внимание, что минуты отключены одним из-за разделения пола. Например, 90 // 60 = 1, но -90 // 60 = -2. Вы можете добавить его к результату, если он отрицательный, но крайний случай ровно за одну минуту (измеренный с точностью до миллисекунды) будет отключен на одну минуту.

+0

спасибо alexander, но это решение работает как для положительных, так и для отрицательных дельт? –

+1

см. Править выше. – Alexander

+0

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

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