在Pandas中根据start_time条件为指定列添加1小时时间增量
解决方案
要实现需求,需先将字符串格式的时间转换为可运算的datetime类型,完成时间增量操作后再转回原格式,具体步骤如下:
- 转换时间列为datetime类型
原数据中的start_time和end_time是字符串,无法直接进行时间比较与运算,先转为datetime对象:
import pandas as pd from datetime import timedelta # 初始化原DataFrame df = pd.DataFrame([["A","9:00 AM","10:20 AM"],["A","11:12 AM","12:32 PM"],["A","1:03 PM","1:33 PM"],["A","1:34 PM","2:44 PM"],["B","9:00 AM","12:20 PM"],["B","12:56 PM","1:06 PM"],["B","1:07 PM","1:17 PM"],["B","1:18 PM","1:28 PM"]],columns=["id","start_time","end_time"]) # 转换时间列格式 df['start_time'] = pd.to_datetime(df['start_time'], format='%I:%M %p') df['end_time'] = pd.to_datetime(df['end_time'], format='%I:%M %p')
- 筛选目标行并添加时间增量
创建条件筛选出start_time大于等于12:30 PM的行,对这些行的start_time和end_time各增加1小时:
# 定义筛选条件 condition = df['start_time'] >= pd.to_datetime('12:30 PM', format='%I:%M %p') # 为符合条件的行添加1小时时间增量 df.loc[condition, ['start_time', 'end_time']] += timedelta(hours=1)
- 转回原字符串格式
将处理后的datetime类型转回原有的"HH:MM AM/PM"字符串格式,同时去掉小时前的前导零以匹配期望输出:
df['start_time'] = df['start_time'].dt.strftime('%I:%M %p').str.lstrip('0') df['end_time'] = df['end_time'].dt.strftime('%I:%M %p').str.lstrip('0')
完整代码
import pandas as pd from datetime import timedelta # 初始化数据 df = pd.DataFrame([["A","9:00 AM","10:20 AM"],["A","11:12 AM","12:32 PM"],["A","1:03 PM","1:33 PM"],["A","1:34 PM","2:44 PM"],["B","9:00 AM","12:20 PM"],["B","12:56 PM","1:06 PM"],["B","1:07 PM","1:17 PM"],["B","1:18 PM","1:28 PM"]],columns=["id","start_time","end_time"]) # 转换为datetime类型 df['start_time'] = pd.to_datetime(df['start_time'], format='%I:%M %p') df['end_time'] = pd.to_datetime(df['end_time'], format='%I:%M %p') # 筛选并添加时间增量 condition = df['start_time'] >= pd.to_datetime('12:30 PM', format='%I:%M %p') df.loc[condition, ['start_time', 'end_time']] += timedelta(hours=1) # 转回字符串格式 df['start_time'] = df['start_time'].dt.strftime('%I:%M %p').str.lstrip('0') df['end_time'] = df['end_time'].dt.strftime('%I:%M %p').str.lstrip('0') print(df)
运行后即可得到你需要的输出结果。
内容的提问来源于stack exchange,提问作者Chethan
相关产品推荐
相关产品推荐

