【发布时间】:2018-07-17 12:55:21
【问题描述】:
我有一个数据集,包括这样的班次开始和结束:
schedule = pd.DataFrame({
"start": pd.to_datetime(['2017-01-01 00:59:00', '2017-01-01 04:59:00', '2017-01-02 00:59:00', '2017-01-02 08:00:00', '2017-01-02 09:59:00']),
"end": pd.to_datetime(['2017-01-01 09:59:00', '2017-01-01 18:00:00', '2017-01-02 09:59:00', '2017-01-02 15:59:00', '2017-01-02 18:00:00']),
"employee": ['KC', 'IT', 'ED', 'NK', 'IT']
})
我希望最终能够知道一天中有多少人(以及谁)在特定时间工作。所以我尝试用我想要的频率的时间戳制作一个新的 DataFrame:
shifts = pd.DataFrame()
shifts['timestamp'] = pd.date_range(start=schedule.start.min(), end=schedule.end.max(), freq='2H')
并[有条件地]将其与我的原始时间表合并如下:
mrg = pd.merge_asof(shifts, schedule, left_on='timestamp', right_on='start').query('timestamp <= end')
结果如下:
timestamp employee end start
0 2017-01-01 00:59:00 KC 2017-01-01 09:59:00 2017-01-01 00:59:00
1 2017-01-01 02:59:00 KC 2017-01-01 09:59:00 2017-01-01 00:59:00
2 2017-01-01 04:59:00 IT 2017-01-01 18:00:00 2017-01-01 04:59:00
3 2017-01-01 06:59:00 IT 2017-01-01 18:00:00 2017-01-01 04:59:00
4 2017-01-01 08:59:00 IT 2017-01-01 18:00:00 2017-01-01 04:59:00
5 2017-01-01 10:59:00 IT 2017-01-01 18:00:00 2017-01-01 04:59:00
现在我的问题是,当 KC 和 IT 都在工作时,时间戳在 2017-01-01 04:59:00 和 2017-01-01 09:59:00 之间,但 mrg 数据框只保留相应的行到 IT。为什么会这样?我在发送到 merge_asof 的参数中缺少什么?
【问题讨论】:
标签: python pandas datetime merge