Pandas为指定国家与时间区间内行日期时间加指定小时数
Pandas按条件批量修改日期字段实现方案
问题说明
现有如下Python Pandas DataFrame样例数据:
| country_ID | date | counter | value |
|---|---|---|---|
| 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 |
需求为:传入日期时间起止范围、country_ID与待增加的小时数,对同时满足国家ID匹配、date字段值落在指定时间区间内的行,将其date字段值累加对应小时数。
调用示例:
add_hours('USA', '2022-03-01 09:00:00', '2022-05-05 21:30:00', 2)
执行后预期输出结果如下:
| country_ID | date | counter | value |
|---|---|---|---|
| USA | 2022-03-01 11:22:29+00:00 | 1 | red |
| UK | 2022-03-01 11:21:20+00:00 | 1 | blue |
| USA | 2022-04-02 14:15:23+00:00 | 1 | red |
| ITL | 2022-04-03 11:13:31+00:00 | 1 | red |
| USA | 2022-05-05 23: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 |
实现代码
核心逻辑是用布尔索引一次性筛选符合条件的行,直接做时间偏移,不需要逐行遍历,运行效率更高。
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
相关产品推荐
相关产品推荐

