首页 > 解决方案 > 从两个系列 python pandas 中获取最接近给定时间戳的日期

问题描述

我有一系列的时间戳dates,看起来像这样:

1   2021-04-21 09:34:00+00:00
2   2021-04-21 10:30:02+00:00
3   2021-04-21 15:54:00+00:00
4   2021-04-22 18:33:57+00:00
5   2021-04-23 18:48:04+00:00

我正在尝试从另一个名为的系列中找到最接近的日期,该系列PublishTime包含 6 天时间段的详细数据,涵盖了一些时间戳。日期必须在时间戳之后,不能在之前。一个示例如下所示:

0   2021-04-21 09:30:00
1   2021-04-21 09:31:00
2   2021-04-21 09:32:00
3   2021-04-21 09:33:00
4   2021-04-21 09:34:00

有没有一种简单的方法可以快速找到最近的日期?我查看了datetime模块,但找不到答案。

编辑我错误地说日期列涵盖了所有时间戳。在我试图与之匹配的第二个系列中,没有周末和非营业时间的分钟数据,因此我想在时间戳之后找到最接近的日期,而不是之前。

标签: pythonpandasdatetime

解决方案


感谢@Quang Hoang,merge_asof 工作。由于它对我来说也是新的,所以我尝试了一下,结果如下。

首先从问题中获取df并重新格式化类型以匹配“PublishTime”系列中的类型

df = pd.DataFrame({'dates': ["2021-04-21 09:34:00+00:00", "2021-04-21 10:30:02+00:00", "2021-04-21 15:54:00+00:00", "2021-04-22 18:33:57+00:00", "2021-04-23 18:48:04+00:00"]})
df['dates'] = pd.to_datetime(df['dates'])
df['dates'] = df['dates'].dt.strftime('%Y-%m-%d %H:%M:%S')
df['dates'] = pd.to_datetime(df['dates'])
df

dates
0   2021-04-21 09:34:00
1   2021-04-21 10:30:02
2   2021-04-21 15:54:00
3   2021-04-22 18:33:57
4   2021-04-23 18:48:04

获取 PublishTime 系列中的 df

df2 = pd.DataFrame({'PublishTime': ["2021-04-21 09:33:00", "2021-04-21 09:34:00", "2021-04-21 09:35:00", "2021-04-21 10:31:00", "2021-04-21 15:56:00", "2021-04-25 15:56:00", "2021-04-26 15:56:00"]})
df2['PublishTime'] = pd.to_datetime(df2['PublishTime'])
df2

PublishTime
0   2021-04-21 09:33:00
1   2021-04-21 09:34:00
2   2021-04-21 09:35:00
3   2021-04-21 10:31:00
4   2021-04-21 15:56:00
5   2021-04-25 15:56:00
6   2021-04-26 15:56:00

最后,merge_asof 并forward用作方向。

pd.merge_asof(df, df2, left_on='dates', right_on='PublishTime', direction='forward')

     dates                  PublishTime
0   2021-04-21 09:34:00 2021-04-21 09:34:00
1   2021-04-21 10:30:02 2021-04-21 10:31:00
2   2021-04-21 15:54:00 2021-04-21 15:56:00
3   2021-04-22 18:33:57 2021-04-25 15:56:00
4   2021-04-23 18:48:04 2021-04-25 15:56:00

如您所见,在 PublishTime 系列中,我没有添加 4 月 22 日至 24 日的数据以显示某些数据可能会丢失(如周末),然后在 25 日使用了下一个最接近的数据。


推荐阅读