我在pandas中有一个数据框,其中包括自事件发生以来的天数。我想创建一个新列,通过减去当前日期的天数来计算事件的日期。每次我尝试应用pd.offsets.Day
或pd.Timedelta
时,都会收到错误消息,指出系列是不受支持的类型。当我使用apply
时也会发生这种情况。当我使用map
时,我收到一个运行时错误,说"调用Python对象时超出了最大递归深度"。
例如,假设我的数据框看起来像这样:
index days_since_event
0 5
1 7
2 3
3 6
4 0
我想创建一个包含活动日期的新列,因此我的预期结果(使用今天2015年12月29日的日期)
index days_since_event event_date
0 5 2015-12-24
1 7 2015-12-22
2 3 2015-12-26
3 6 2015-12-23
4 0 2015-12-29
我尝试了多种方法来实现这一点,但每个方法都收到了错误。
我尝试过的一种方法是:
now = pd.datetime.date(pd.datetime.now())
df['event_date'] = now - df.days_since_event.apply(pd.offsets.Day)
有了这个,我收到一个错误,说系列是不受支持的类型。
我使用.map
而不是.apply
尝试了上述操作,并在调用Python对象" 时收到"超出最大递归深度的错误。
我还尝试将日期转换为timedelta,例如:
df.days_since_event = (dt.timedelta(days = df.days_since_event)).apply
这也引用了一个错误,引用该系列是不受支持的类型。
答案 0 :(得分:6)
首先,要将具有整数的列转换为timedelta,您可以使用to_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]
然后你可以用当前日期创建一个新列并减去那些timedelta:
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]
答案 1 :(得分:2)
只需跟上joris的回应,您就可以使用pd.to_timedelta(x, unit='')
将int或float转换为所需的任何时间单位,仅更改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'