То, что вы ищете, называется параметрами ковариационного типа . Проблема в том, что они не являются безопасными для типов в общем случае, в частности для изменяемых списков. Предположим, что у вас есть List
, и ему разрешено работать как List
. Что происходит, когда вы пытаетесь добавить Cat к этому List
, который действительно является List
? Автоматически разрешая ковариационные параметры типа, поэтому разбивает систему типов.
Было бы полезно добавить синтаксис, чтобы позволить параметрам типа указываться как ковариантные, что позволяет избежать ? extends Foo
в объявлениях метода, но это делает добавьте дополнительную сложность.
Для этого вам понадобится 0.11 (0.11rc1 отсутствует, окончательная ошибка на следующей неделе)
In [9]: df = DataFrame([ Timestamp('20010101'), Timestamp('20040601') ])
In [10]: df
Out[10]:
0
0 2001-01-01 00:00:00
1 2004-06-01 00:00:00
In [11]: df = DataFrame([ Timestamp('20010101'),
Timestamp('20040601') ],columns=['age'])
In [12]: df
Out[12]:
age
0 2001-01-01 00:00:00
1 2004-06-01 00:00:00
In [13]: df['today'] = Timestamp('20130419')
In [14]: df['diff'] = df['today']-df['age']
In [16]: df['years'] = df['diff'].apply(lambda x: float(x.item().days)/365)
In [17]: df
Out[17]:
age today diff years
0 2001-01-01 00:00:00 2013-04-19 00:00:00 4491 days, 00:00:00 12.304110
1 2004-06-01 00:00:00 2013-04-19 00:00:00 3244 days, 00:00:00 8.887671
Вам нужно, чтобы этот нечетный пример применялся в конце, потому что еще не полная поддержка сканеров timedelta64 [ns] (например, как мы используем Timestamps сейчас для datetime64 [ns], начиная с 0.12)
Не уверен, что вам все еще нужно, но в Pandas 0.14 я обычно использую метод .astype ('timedelta64 [X]') http://pandas.pydata.org/pandas-docs/stable/timeseries. html (преобразование частоты)
df = pd.DataFrame([ pd.Timestamp('20010101'), pd.Timestamp('20040605') ])
df.ix[0]-df.ix[1]
Возвраты:
blockquote>0 -1251 days dtype: timedelta64[ns]
(df.ix[0]-df.ix[1]).astype('timedelta64[Y]')
Возвраты:
0 -4 dtype: float64
Надеюсь, что это поможет
Давайте укажем, что у вас есть серия pandas с именем time_difference, которая имеет тип numpy.timedelta64 [ns]
. Один способ извлечения только дня (или любого другого желаемого атрибута) заключается в следующем:
just_day = time_difference.apply(lambda x: pd.tslib.Timedelta(x).days)
Эта функция используется, потому что объект numpy.timedelta64 не имеет атрибута 'days'.
Используя тип Панды Timedelta
, доступный с v0.15.0, вы также можете сделать:
In[1]: import pandas as pd
In[2]: df = pd.DataFrame([ pd.Timestamp('20150111'),
pd.Timestamp('20150301') ], columns=['date'])
In[3]: df['today'] = pd.Timestamp('20150315')
In[4]: df
Out[4]:
date today
0 2015-01-11 2015-03-15
1 2015-03-01 2015-03-15
In[5]: (df['today'] - df['date']).dt.days
Out[5]:
0 63
1 14
dtype: int64