如何用Python为单列中每个特定时间批量添加1-6小时Timedelta
解决时间序列生成问题的方案
首先,咱们先梳理下原代码里的几个关键问题,导致你拿不到预期结果:
- 你把
duration列转成了字符串格式,这就没法直接进行时间增量运算了——字符串和timedelta是没法相加的,这是核心问题之一。 - 自定义的
time函数逻辑混乱:循环没正确遍历要添加的小时数,而且最后没有返回生成的序列,自然输出都是空值。
修正后的完整步骤代码
咱们重新调整代码,从第一步开始优化,确保类型正确,然后实现时间序列生成:
import pandas as pd import numpy as np # 假设你的原始data已经加载完成,先处理第一步:X3=5的时间转为00:00:00 # 先把date+time转成datetime类型,方便后续处理 data['full_datetime'] = pd.to_datetime(data['date'] + " " + data['time'], format='%d/%m/%Y %H:%M:%S', dayfirst=True) # 处理X3=5的情况:把对应的时间部分设为00:00:00,得到新的datetime data['adjusted_datetime'] = np.where( data['X3'].eq(5), data['full_datetime'].dt.normalize(), # 把时间部分转为00:00:00 data['full_datetime'] ) # 提取所有时间为00:00:00的行(也就是adjusted_datetime的时间部分是00:00:00) target_rows = data[data['adjusted_datetime'].dt.time == pd.to_datetime('00:00:00').time()] # 定义函数:为每个目标时间生成00:00:00到06:00:00的序列(含原时间+加1到6小时) def generate_time_series(datetime_val): # 生成从0到6小时的增量 hours_added = pd.to_timedelta(np.arange(7), unit='h') # 生成对应的时间序列 time_series = datetime_val + hours_added # 如果需要转成时间字符串格式,就用下面这行;否则保留datetime类型 return time_series.dt.strftime('%H:%M:%S').tolist() # 为每个目标行生成时间序列 target_rows['generated_times'] = target_rows['adjusted_datetime'].apply(generate_time_series) # 如果你想把生成的序列展开成单独的行(每个时间占一行),可以用explode expanded_data = target_rows.explode('generated_times').reset_index(drop=True) # 输出结果 print(expanded_data[['adjusted_datetime', 'generated_times']])
关键优化点说明
- 保留时间类型:全程用
datetime类型处理,避免转成字符串,这样时间增量运算才可行。 - 简化时间调整逻辑:用
dt.normalize()直接把datetime的时间部分转为00:00:00,比手动处理字符串更可靠。 - 正确生成时间序列:通过
pd.to_timedelta生成0到6小时的增量列表,直接和原datetime相加,一次得到所有需要的时间,再按需转成字符串格式。 - 可选展开行:用
explode可以把每个列表里的时间拆成单独的行,方便后续分析或保存。
预期输出示例
假设你有一行adjusted_datetime是2024-05-20 00:00:00,那么生成的generated_times会是['00:00:00', '01:00:00', '02:00:00', '03:00:00', '04:00:00', '05:00:00', '06:00:00'],如果用explode后,这行会变成7行,每行对应一个时间。
内容的提问来源于stack exchange,提问作者team
相关产品推荐
相关产品推荐

