如何用Pandas修改指定时间的日期,保留时间并匹配最近15点日期?
解决Pandas中替换21点左右记录日期为最近15点对应日期的问题
核心思路
针对数据中21点左右的时间记录,我们需要:
- 筛选出符合时间范围的目标记录
- 从现有数据中提取所有15点的日期并排序
- 为每条目标记录匹配最近的、早于该记录的15点日期
- 替换目标记录的日期部分,保留原时间
代码实现(适配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
相关产品推荐
相关产品推荐

