【问题标题】:Convert integer series to timedelta in pandas在熊猫中将整数系列转换为时间增量
【发布时间】:2015-12-29 21:42:43
【问题描述】:

我在 pandas 中有一个数据框,其中包含事件发生后的天数。我想创建一个新列,通过从当前日期减去天数来计算事件的日期。每次我尝试应用 pd.offsets.Daypd.Timedelta 时,都会收到一条错误消息,指出 Series 是不受支持的类型。当我使用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)

我收到一条错误消息,指出 Series 是不受支持的类型。

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

我还尝试将天数转换为时间增量,例如:

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

这也收到一个错误,引用该系列是不受支持的类型。

【问题讨论】:

  • 邮政编码,问题可能是任何事情

标签: python pandas


【解决方案1】:

首先,要将整数列转换为时间增量,可以使用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]

【讨论】:

  • 确保原始日期 df['event_date'] 和 df['days_since_event'] 都是 [ns] 格式。我以前从未在 df.dtypes 中看到过 timedelta 格式。谢谢!
  • 请注意,如果使用年份,则不再支持此功能。请参阅此处以获取解决方案stackoverflow.com/questions/60122391/…
【解决方案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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 2013-10-02
    • 1970-01-01
    • 2019-10-12
    • 2019-03-27
    • 1970-01-01
    • 2014-11-23
    相关资源
    最近更新 更多