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

如何用Pandas修改指定时间的日期,保留时间并匹配最近15点日期?

解决Pandas中替换21点左右记录日期为最近15点对应日期的问题

核心思路

针对数据中21点左右的时间记录,我们需要:

  1. 筛选出符合时间范围的目标记录
  2. 从现有数据中提取所有15点的日期并排序
  3. 为每条目标记录匹配最近的、早于该记录的15点日期
  4. 替换目标记录的日期部分,保留原时间

代码实现(适配Python 3.8.5 + Pandas 1.1.3)

import pandas as pd

# 示例数据(可替换为你的实际数据)
data = pd.DataFrame({
    'datetime': [
        '2018-08-21 15:00:00',
        '2018-08-22 21:01:00',
        '2018-08-24 15:00:00',
        '2018-08-25 20:58:00',
        '2018-08-30 15:00:00',
        '2018-09-01 21:10:00',
        '2018-08-20 14:30:00'
    ]
})

# 转换为datetime类型,这是后续处理的基础
data['datetime'] = pd.to_datetime(data['datetime'])

# 提取所有15点记录的日期,去重后排序
fifteen_pm_dates = sorted(data[data['datetime'].dt.hour == 15]['datetime'].dt.date.unique())

# 定义函数:找到最近的早于目标日期的15点日期
def get_last_15pm_date(target_dt):
    last_valid_date = None
    for date in fifteen_pm_dates:
        if date < target_dt.date():
            last_valid_date = date
        else:
            break
    return last_valid_date

# 筛选21点左右的记录(时间范围可按需调整,这里取20:50-21:10)
time_low = pd.to_datetime('20:50:00').time()
time_high = pd.to_datetime('21:10:00').time()
target_mask = (data['datetime'].dt.time >= time_low) & (data['datetime'].dt.time <= time_high)

# 替换目标记录的日期
data.loc[target_mask, 'datetime'] = data.loc[target_mask, 'datetime'].apply(
    lambda dt: pd.Timestamp.combine(get_last_15pm_date(dt), dt.time())
)

# 查看处理结果
print(data)

关键细节说明

  • 时间范围调整:如果你的"21点左右"定义不同,直接修改time_low和time_high即可,比如改成20:30:00到21:30:00
  • 无匹配日期的处理:如果某条21点记录没有找到早于它的15点日期,get_last_15pm_date会返回None,此时可以根据业务需求添加判断(比如保留原日期,或者标记异常)
  • 版本兼容性:代码中使用的dt.date、pd.Timestamp.combine等方法在Pandas 1.1.3和Python 3.8.5环境下完全支持

内容的提问来源于stack exchange,提问作者junyu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:53:13