Python 将整数系列转换为熊猫中的时间增量

Python 将整数系列转换为熊猫中的时间增量,python,pandas,Python,Pandas,我有一个熊猫数据框,其中包括事件发生后的天数。我想创建一个新列,通过从当前日期减去天数来计算事件的日期。每次尝试应用pd.offset.Day或pd.Timedelta时,我都会收到一个错误,指出序列是不受支持的类型。使用apply时也会发生这种情况。当我使用map时,我收到一个运行时错误,说“调用Python对象时超过了最大递归深度” 例如,假设我的数据帧如下所示: index days_since_event 0 5 1 7 2 3 3

我有一个熊猫数据框,其中包括事件发生后的天数。我想创建一个新列,通过从当前日期减去天数来计算事件的日期。每次尝试应用
pd.offset.Day
pd.Timedelta
时,我都会收到一个错误,指出序列是不受支持的类型。使用
apply
时也会发生这种情况。当我使用
map
时,我收到一个运行时错误,说“调用Python对象时超过了最大递归深度”

例如,假设我的数据帧如下所示:

index    days_since_event
0        5
1        7
2        3
3        6
4        0
我想创建一个包含活动日期的新列,以显示我的预期结果(使用今天的日期12/29/2015)

我尝试了多种方法,但都收到了错误

我尝试过的一种方法是:

now = pd.datetime.date(pd.datetime.now())
df['event_date'] = now - df.days_since_event.apply(pd.offsets.Day)
我收到一个错误,说Series是不受支持的类型

我用
.map
而不是
.apply
尝试了上述操作,收到了“调用Python对象时超过了最大递归深度”的错误

我还尝试将天数转换为timedelta,例如:

df.days_since_event = (dt.timedelta(days = df.days_since_event)).apply

这也收到了一个引用不支持类型的序列的错误。

首先,要将包含整数的列转换为timedelta,可以使用
转换为\u timedelta

In [60]: pd.to_timedelta(df['days_since_event'], unit='D')
Out[60]:
0   5 days
1   7 days
2   3 days
3   6 days
4   0 days
Name: days_since_event, dtype: timedelta64[ns]
然后,您可以使用当前日期创建一个新列,并减去这些时间差:

In [62]: df['event_date'] = pd.Timestamp('2015-12-29')

In [63]: df['event_date'] = df['event_date'] -  pd.to_timedelta(df['days_since_event'], unit='D')

In [64]: df['event_date']
Out[64]:
0   2015-12-24
1   2015-12-22
2   2015-12-26
3   2015-12-23
4   2015-12-29
dtype: datetime64[ns]

为了跟进joris的回答,您可以使用
pd.将int或float转换为您想要的任何时间单位,转换为\u timedelta(x,unit='')
,只更改
unit=
的条目:

# Years, Months, Days:
pd.to_timedelta(3.5, unit='Y') # returns '1095 days 17:27:36'
pd.to_timedelta(3.5, unit='M') # returns '91 days 07:27:18'
pd.to_timedelta(3.5, unit='D') # returns '3 days 12:00:00'

# Hours, Minutes, Seconds:
pd.to_timedelta(3.5, unit='h') # returns '0 days 03:30:00'
pd.to_timedelta(3.5, unit='m') # returns '0 days 00:03:30'
pd.to_timedelta(3.5, unit='s') # returns '0 days 00:00:03.50'
请注意,一旦格式正确,数学运算就是合法的:

pd.to_timedelta(3.5, unit='h') - pd.to_timedelta(3.25, unit='h') # returns '0 days 00:15:00'

发布代码,问题可能是任何内容确保原始日期df['event_date']和df['days_since_event']均为[ns]格式。我以前在df.dtypes中从未见过timedelta格式。谢谢
pd.to_timedelta(3.5, unit='h') - pd.to_timedelta(3.25, unit='h') # returns '0 days 00:15:00'