2016-09-23 3 views
1

Есть ли идиоматический способ pandas найти разницу в днях между двумя pandas DatetimeIndex?pandas elementwise разница между двумя DatetimeIndex

>>> d1 = pd.to_datetime(['2000-01-01', '2000-01-02']) 
>>> d2 = pd.to_datetime(['2001-01-01', '2001-01-02']) 

- оператора установлено значение, то есть даты в d1, но не в d2.

>>> d1-d2 
DatetimeIndex(['2000-01-01', '2000-01-02'], dtype='datetime64[ns]', freq=None) 

IMO, это не согласуется с поведением numpy и pure python. Даже сами панды

>>> d2[0]-d1[0] 
Timedelta('366 days 00:00:00') 

Это то, что я хочу, но уродливое.

>>> [d.days for d in d2.to_pydatetime() - d1.to_pydatetime()] 
[366, 366] 
+0

'd1-d2' должно быть' d2-d1' ?? – danio

ответ

1

Вы используете np.subtract непосредственно:

np.subtract(d2, d1) 

Which'll дать вам TimedeltaIndex в результате:

TimedeltaIndex(['366 days', '366 days'], dtype='timedelta64[ns]', freq=None) 

Затем при желании использовать .days на этом.

Другой возможный путь:

pd.to_timedelta(d2.values - d1.values).days 

Which'll оставить вас:

array([366, 366]) 
+0

Или '(d2.values ​​- d1.values) .astype ('timedelta64 [D]')' – danio

1

Это происходит потому, что dtype является конструкцией, если построить datetimeIndex так арифметические операции поставь-, Series из них вы можете выполнить вычитание по методу:

In [349]: 
d1 = pd.to_datetime(['2000-01-01', '2000-01-02']) 
d2 = pd.to_datetime(['2001-01-01', '2001-01-02']) 
s1 = pd.Series(d1) 
s2 = pd.Series(d2) 
(s1-s2).abs() 

Out[349]: 
0 366 days 
1 366 days 
dtype: timedelta64[ns] 
+0

Спасибо. Но я надеюсь, что вы согласитесь, что «np.subtract (d2, d1)» Джона «лучше», даже если вы избили его вовремя. – jf328

+1

@ jf328 Я думаю, что полезно понять, что это по дизайну, а не ошибка, тип, возвращаемый из 'to_datetime', является datetimeIndex, поэтому арифметические операции заданы, только серии, DataFrames, панели и т. Д. Ведут себя как матрицы – EdChum

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