как извлечь дни как целые числа из объекта timedelta64[ns] в python

У меня есть кадр данных pandas со столбцом вроде:

In [96]: data['difference']
Out[96]: 
0                 NaT
1     1 days 21:34:30
2     0 days 16:57:36
3     0 days 00:16:51
4     0 days 15:52:38
5     0 days 14:19:34
6     0 days 02:54:46
7     1 days 04:21:28
8     0 days 01:58:55
9     0 days 10:30:35
10    0 days 07:53:04
....
Name: difference, dtype: timedelta64[ns]

Я хочу создать рядом с ним столбец с целыми числами, соответствующими значениям дней в этом столбце.


person Blue Moon    schedule 09.11.2015    source источник
comment
Мне просто нужен столбец типа 1,0,0,0,0,0,1,0,0,0   -  person Blue Moon    schedule 09.11.2015
comment
я думаю, вы можете найти свой ответ здесь: stackoverflow.com/questions/18215317/   -  person Nhor    schedule 09.11.2015
comment
Я уже смотрел на это, но решение days.astype(int) у меня не работает   -  person Blue Moon    schedule 09.11.2015


Ответы (3)


Это должно преобразовать ваш тип timedelta64[ns] в float64, представляющий дни:

data['difference'].astype('timedelta64[D]')
person Nhor    schedule 09.11.2015
comment
Этот метод astype('timedelta64[D]') (около 96 мс) намного эффективнее, чем dt.days. (около 24 с) для 4 000 000 строк. - person Pengju Zhao; 13.07.2017

Вы можете использовать dt.days, чтобы извлечь только дни из вашей серии,

df.difference
Out[117]: 
0   -1 days +00:00:05
1                 NaT
2   -1 days +00:00:05
3     1 days 00:00:00
dtype: timedelta64[ns]

df.difference.dt.days
Out[118]: 
0    -1
1   NaN
2    -1
3     1
dtype: float64

Экстракты всех других компонентов,

dr
Out[93]: 
0   -1 days +00:00:05
1                 NaT
2     1 days 02:04:05
3     1 days 00:00:00
dtype: timedelta64[ns]

dr.dt.components
Out[95]: 
   days  hours  minutes  seconds  milliseconds  microseconds  nanoseconds
0    -1      0        0        5             0             0            0
1   NaN    NaN      NaN      NaN           NaN           NaN          NaN
2     1      2        4        5             0             0            0
3     1      0        0        0             0             0            0
person WoodChopper    schedule 09.11.2015
comment
Этот метод довольно медленный. Напротив, метод astype('timedelta64[D]') (около 96 мс) намного эффективнее, чем dt.days. (около 24 с) для 4 000 000 строк. - person Pengju Zhao; 13.07.2017

Согласно документации pandas, вы можете извлечь дней с использованием метода astype объекта timedelta64 и типом результата float64.

td.astype('timedelta64[D]')
person Kenly    schedule 09.11.2015