2016-05-06 4 views
1

Есть ли эквивалент функции датированного SQL в пандах Python? Ответ на этот вопрос: Add column with number of days between dates in DataFrame pandas объясняет, как рассчитать разницу в днях. Например:pandas: функция эквивалентна датфик()?

>>> (pd.to_datetime('15-10-2010') - pd.to_datetime('15-07-2010'))/pd.offsets.Day(1) 
92.0 

Однако, у меня есть два вопроса:

  1. Есть ли способ, чтобы вычислить разницу в месяцах? Я могу аппроксимировать деление результата выше на 30, на 31, но мне было интересно, есть ли какая-то встроенная функция, которая делает это автоматически.
  2. Каков синтаксис pd.offsets? Я пробовал делиться на pd.offsets.Month (1), и он не работает. Я посмотрел документацию здесь (что зверским, как и все документации в Python!): http://pandas.pydata.org/pandas-docs/stable/timeseries.html#dateoffset-objects но день() не существует, так что я запутался
+0

Кроме того, я не могу преобразовать результат в целое число. Есть идеи? –

+0

Ммм, я нашел здесь http://stackoverflow.com/questions/22132525/add-column-with-number-of-days-between-dates-in-dataframe-pandas, как конвертировать из timedelta в float: divide by np .timedelta64 (1, 'D'). Почему и где это задокументировано, есть отдельные вопросы !!! –

ответ

1

UPDATE:

def months_between(d1, d2): 
    dd1 = min(d1, d2) 
    dd2 = max(d1, d2) 
    return (dd2.year - dd1.year)*12 + dd2.month - dd1.month 

In [125]: months_between(pd.to_datetime('2015-01-02 12:13:14'), pd.to_datetime('2012-03-02 12:13:14')) 
Out[125]: 34 

OLD ответ:

In [40]: (pd.to_datetime('15-10-2010') - pd.to_datetime('15-07-2010')).days 
Out[40]: 92 

вы также можете сделать это в течение нескольких месяцев:

In [48]: pd.to_datetime('15-10-2010').month - pd.to_datetime('15-07-2010').month 
Out[48]: 3 
+0

Супер! Большое спасибо! Я супер неуклюжий или документация pandas действительно ужасна? –

+0

На самом деле, нет: это не работает с разными годами, например, все еще возвращается 3: pd.to_datetime ('15 -10-2015 '). Month - pd.to_datetime ('15 -07-2010'). Month –

+0

Это было бы потому, что вы используете только свойство '.month', не принимая во внимание, что между двумя датами существует несколько лет. – Thanos

1

Если вы посмотрите вокруг немного, кажется, что месяца не удается выйти из TimeDelta:

In [193]: date_1 = pd.to_datetime('2015-01-02 12:13:14') 

In [194]: date_2 = pd.to_datetime('2012-03-02 12:13:14') 

In [195]: date_1 - date_2 
Out[195]: Timedelta('1036 days 00:00:00') 

In [199]: td_1. 
td_1.asm8   td_1.days   td_1.freq   td_1.microseconds td_1.resolution  td_1.to_pytimedelta td_1.value   
td_1.ceil   td_1.delta   td_1.is_populated td_1.min    td_1.round   td_1.to_timedelta64 td_1.view    
td_1.components  td_1.floor   td_1.max    td_1.nanoseconds  td_1.seconds   td_1.total_seconds 

In [199]: td_1.components 
Out[199]: Components(days=1036, hours=0, minutes=0, seconds=0, milliseconds=0, microseconds=0, nanoseconds=0) 

Кроме того, Components не предлагают различные деноминации одного и того же значения, казалось бы, но

In [213]: td_1.components.days 
Out[213]: 1036 

In [214]: td_1.components.hours 
Out[214]: 0 

в конце концов, кажется, что то, что вы делали до сих пор кажется, что «лучший» решение:

In [214]: td_1.components.days/30 
Out[214]: 34.53333333333333 

In [215]: np.round(td_1.components.days/30) 
Out[215]: 35.0 

In [216]: np.floor(td_1.components.days/30) 
Out[216]: 34.0 

Не отличная новость, но решение в любом случае.

Что касается сравнения документации, к которой относится Matlab к этому из панд, вы правы. Однако, если вам нужно сравнить цену двух, а также, возможно, на некоторые вопросы будет дан ответ. (?)

+0

Конечно, но я хочу сказать, что в деловой среде время - это деньги, а «свободная» цена плохо документированного продукта - это ложная экономика. Я только что потратил впустую около часа, пытаясь понять, как вычитать даты. Если бы существовало коммерческое программное обеспечение с примерно функциональностью панд и качеством документации Matlab, я бы купил его в одно мгновение –

+0

Согласен, я готов поспорить, что многие люди думают так же! – Thanos