You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据另一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:10:34