如何根据另一DataFrame的小时级日期时间过滤DataFrame?
基于小时级日期过滤秒级日期DataFrame
问题描述
现有两个Pandas DataFrame:df1(含6列,日期列格式为yyyy-mm-dd hh:mm:ss,精度到秒)和df2(含4列,日期列格式为yyyy-mm-dd hh:--:--,精度到小时)。需要过滤df1,仅保留日期小时与df2中存在的小时完全匹配的记录。
示例数据
df1:
| Date (yyyy-mm-dd hh:mm:ss) |
|---|
| 2016-03-01 1:02:03 |
| 2016-04-01 1:03:04 |
| 2016-05-01 10:04:05 |
| 2016-05-01 11:07:08 |
df2:
| Date (yyyy-mm-dd hh:--:--) |
|---|
| 2016-03-01 1:00:00 |
| 2016-04-01 2:00:00 |
| 2016-05-01 3:00:00 |
| 2016-05-01 4:00:00 |
期望输出
过滤后的df1:
| Date (yyyy-mm-dd hh:mm:ss) |
|---|
| 2016-03-01 1:02:03 |
| 2016-04-01 1:03:04 |
仅保留前两行,因为它们的日期小时在df2中存在。
解决方案
核心思路是将两个DataFrame的日期列统一为小时级精度,再通过匹配小时级日期完成过滤。
步骤1:转换日期列为datetime类型
先确保日期列是Pandas可识别的datetime格式:
import pandas as pd # 转换df1的日期列 df1['Date'] = pd.to_datetime(df1['Date (yyyy-mm-dd hh:mm:ss)']) # 转换df2的日期列 df2['Date'] = pd.to_datetime(df2['Date (yyyy-mm-dd hh:--:--)'])
步骤2:生成小时级匹配标识
将日期向下取整到小时,得到统一的yyyy-mm-dd hh:00:00格式时间戳,作为匹配依据:
# 为df1添加小时级日期列 df1['hour_level_date'] = df1['Date'].dt.floor('H') # 提取df2的有效小时集合(去重提升匹配效率) valid_hours = set(df2['Date'].dt.floor('H'))
步骤3:过滤df1
筛选出hour_level_date在有效小时集合内的记录:
filtered_df1 = df1[df1['hour_level_date'].isin(valid_hours)] # 移除临时列(按需选择) filtered_df1 = filtered_df1.drop('hour_level_date', axis=1)
完整代码示例
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({ 'Date (yyyy-mm-dd hh:mm:ss)': [ '2016-03-01 1:02:03', '2016-04-01 1:03:04', '2016-05-01 10:04:05', '2016-05-01 11:07:08' ] }) df2 = pd.DataFrame({ 'Date (yyyy-mm-dd hh:--:--)': [ '2016-03-01 1:00:00', '2016-04-01 2:00:00', '2016-05-01 3:00:00', '2016-05-01 4:00:00' ] }) # 转换日期列 df1['Date'] = pd.to_datetime(df1['Date (yyyy-mm-dd hh:mm:ss)']) df2['Date'] = pd.to_datetime(df2['Date (yyyy-mm-dd hh:--:--)']) # 生成匹配键并过滤 df1['hour_level_date'] = df1['Date'].dt.floor('H') valid_hours = set(df2['Date'].dt.floor('H')) filtered_df1 = df1[df1['hour_level_date'].isin(valid_hours)].drop('hour_level_date', axis=1) # 输出结果 print(filtered_df1[['Date (yyyy-mm-dd hh:mm:ss)']])
说明
dt.floor('H')用于将日期向下取整到最近小时,确保秒级与小时级时间的精度对齐。- 将
df2的小时级日期转为集合,可大幅提升isin()的匹配速度,尤其适用于大数据量场景。 - 可根据需求保留或删除临时列、调整输出列的显示。
内容的提问来源于stack exchange,提问作者Asa Ya
相关产品推荐
相关产品推荐

