基于DataFrame列首值为同areaId行递增更新时间戳
解决方案:按areaId递增更新startTime1时间戳
步骤1:转换数据类型
当前startTime1和waterDuration均为object类型,无法直接进行时间运算,先转换为对应可计算类型:
import pandas as pd # 将时间列转为datetime类型 df['startTime1'] = pd.to_datetime(df['startTime1']) # 将时长列转为数值类型(自动适配整数/浮点数) df['waterDuration'] = pd.to_numeric(df['waterDuration'])
若waterDuration存在非数值异常值,可添加参数处理无效值:
df['waterDuration'] = pd.to_numeric(df['waterDuration'], errors='coerce')
步骤2:分组递推更新时间戳
按areaId分组,以每组首行的startTime1为初始值,累加前面所有行的waterDuration生成后续行的时间戳:
def update_group_start_time(group): # 取组内第一行的时间作为初始基准 initial_time = group['startTime1'].iloc[0] # 计算累计时长:首行累计为0,后续行依次累加前面所有行的时长 cumulative_duration = group['waterDuration'].shift(1).fillna(0).cumsum() # 生成新时间戳(unit需匹配waterDuration的实际单位:seconds/minutes/hours等) group['startTime1'] = initial_time + pd.to_timedelta(cumulative_duration, unit='minutes') return group # 应用分组逻辑,保留所有原始列仅更新startTime1 df = df.groupby('areaId', group_keys=False).apply(update_group_start_time)
可选:还原时间戳字符串格式
如果需要将更新后的startTime1转回原字符串格式,可自定义格式输出:
# 示例格式:年-月-日 时:分:秒 df['startTime1'] = df['startTime1'].dt.strftime('%Y-%m-%d %H:%M:%S')
关键说明
- 需确保
waterDuration的实际时间单位与代码中unit参数一致,比如时长为秒则改为unit='seconds' - 整个操作保留所有原始列及值,仅修改
startTime1列
内容的提问来源于stack exchange,提问作者saurabh dhyani
相关产品推荐
相关产品推荐

