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

Pandas为指定国家与时间区间内行日期时间加指定小时数

Pandas按条件批量修改日期字段实现方案

问题说明

现有如下Python Pandas DataFrame样例数据:

country_IDdatecountervalue
USA2022-03-01 09:22:29+00:001red
UK2022-03-01 11:21:20+00:001blue
USA2022-04-02 12:15:23+00:001red
ITL2022-04-03 11:13:31+00:001red
USA2022-05-05 21:04:42+00:001green
USA2022-05-05 22:01:51+00:001green
ITL2022-06-06 13:00:41+00:001red

需求为:传入日期时间起止范围、country_ID与待增加的小时数,对同时满足国家ID匹配、date字段值落在指定时间区间内的行,将其date字段值累加对应小时数。

调用示例:

add_hours('USA', '2022-03-01 09:00:00', '2022-05-05 21:30:00', 2)

执行后预期输出结果如下:

country_IDdatecountervalue
USA2022-03-01 11:22:29+00:001red
UK2022-03-01 11:21:20+00:001blue
USA2022-04-02 14:15:23+00:001red
ITL2022-04-03 11:13:31+00:001red
USA2022-05-05 23:04:42+00:001green
USA2022-05-05 22:01:51+00:001green
ITL2022-06-06 13:00:41+00:001red

实现代码

核心逻辑是用布尔索引一次性筛选符合条件的行,直接做时间偏移,不需要逐行遍历,运行效率更高。

import pandas as pd

def add_hours(df, target_country, start_time, end_time, hour_delta):
    # 统一把date字段转为带UTC时区的datetime格式,避免格式不匹配问题
    df['date'] = pd.to_datetime(df['date'], utc=True)
    # 把传入的起止时间也转为同格式的时间戳
    start_ts = pd.to_datetime(start_time, utc=True)
    end_ts = pd.to_datetime(end_time, utc=True)
    # 构造筛选条件:国家ID匹配 + 时间落在指定区间
    match_mask = (
        (df['country_ID'] == target_country)
        & (df['date'] >= start_ts)
        & (df['date'] <= end_ts)
    )
    # 对匹配到的行累加指定小时数
    df.loc[match_mask, 'date'] += pd.Timedelta(hours=hour_delta)
    return df

调用验证

# 构造样例数据
raw_data = [
    ["USA", "2022-03-01 09:22:29+00:00", 1, "red"],
    ["UK", "2022-03-01 11:21:20+00:00", 1, "blue"],
    ["USA", "2022-04-02 12:15:23+00:00", 1, "red"],
    ["ITL", "2022-04-03 11:13:31+00:00", 1, "red"],
    ["USA", "2022-05-05 21:04:42+00:00", 1, "green"],
    ["USA", "2022-05-05 22:01:51+00:00", 1, "green"],
    ["ITL", "2022-06-06 13:00:41+00:00", 1, "red"]
]
df = pd.DataFrame(raw_data, columns=["country_ID", "date", "counter", "value"])

# 按示例传参调用
result = add_hours(df, 'USA', '2022-03-01 09:00:00', '2022-05-05 21:30:00', 2)
print(result)

运行后输出和预期完全一致:3条符合条件的USA记录日期均累加2小时,其余国家、不在时间区间内的行数据保持不变。

注意:如果业务中使用的是UTC以外的时区,把代码中utc=True替换为对应时区字符串即可,避免时区不一致导致筛选失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:09:34