【发布时间】:2018-02-06 21:36:26
【问题描述】:
我有一个 pandas 数据框,我想计算 days_until_next_event 用于:
df = pd.DataFrame({'message_count': [1, 3, 5, 6, 2, 8, 10, 2], 'event_date': ['2016-01-05', '2016-01-05', '2016-01-05', '2016-01-13', '2016-01-13', '2016-01-13', '2016-01-28', '2016-01-28'], 'message_date': ['2016-01-05', '2016-01-06', '2016-01-10', '2016-01-13', '2016-01-16', '2016-01-22', '2016-01-28', '2016-01-30']})
event_date message_count message_date
2016-01-05 1 2016-01-05
2016-01-05 3 2016-01-06
2016-01-05 5 2016-01-10
2016-01-13 6 2016-01-13
2016-01-13 2 2016-01-16
2016-01-13 8 2016-01-22
2016-01-28 10 2016-01-28
2016-01-28 2 2016-01-30
预期的数据框如下所示:
days_until_next_event event_date message_count message_date
0 days 2016-01-05 1 2016-01-05
7 days 2016-01-05 3 2016-01-06
3 days 2016-01-05 5 2016-01-10
0 days 2016-01-13 6 2016-01-13
12 days 2016-01-13 2 2016-01-16
6 days 2016-01-13 8 2016-01-22
0 days 2016-01-28 10 2016-01-28
NaT 2016-01-28 2 2016-01-30
其中days_until_next_event 是message_date 和下一个新 event_date 之间的区别。如果两个日期相同,则其值为 0。我可以通过以下方式获取自上次事件以来的天数:
df2['days_since_last_dte'] = [(message - event) for message, event in zip(df2['message_date'], df2['event_date'])]
但在添加最后一个与下一个“新”event_date进行比较时遇到问题@
【问题讨论】:
-
请解释一下dune = "7 days" 是如何记录
event_date=2016-01-05, message_count=3, message_date=2016-01-06的?为什么下一个新的 message_date 不是 2016-01-10(从第 3 行开始),因此是“5 天”? -
@smci 因为沙丘是根据下一个 new
event_date而不是event_date本身计算的。在这种情况下,对于event_date=2016-01-05, message_count=3, message_date=2016-01-06,它将是2016-01-13-2016-01-06= 7 天。对于message_date = 2016-01-10,它将是2016-13-01-2016-01-10= 3 天。所有message_dates和event_date=2016-01-05都将在沙丘计算中使用event_date=2016-01-13,因为这是下一个事件。希望这能澄清你的问题。
标签: python-3.x pandas datetime