DateTime格式处理问题:设置初始日期后自动推算跨天日期
我将两列原格式为'%H:%M'的数据转换为Datetime类型后,日期默认变为1900-01-01。我希望将第一行的日期设置为"2023-11-12",并让后续Actual Time列的日期能自动识别跨天情况,比如自动切换为2023-11-13及后续日期。
相关代码如下:
>> dfsched['Actual Time']= pd.to_datetime(dfsched['Actual Time'], format='%H:%M') >> dfsched.head()
Engine Trip Arr/ Dept Schedule Time Actual Time
0 670.0 E9207 D 1900-01-01 06:12:00 1900-01-01 05:49:00
1 670.0 E9207 A 1900-01-01 06:22:00 1900-01-01 06:00:00
2 670.0 9207 D 1900-01-01 06:39:00 1900-01-01 06:39:00
3 670.0 9207 A 1900-01-01 06:43:00 1900-01-01 06:44:00
4 670.0 9207 D 1900-01-01 06:44:00 1900-01-01 06:45:00
解决方案
方法一:向量式高效处理(推荐)
利用Pandas的向量操作,无需逐行循环,适合大型数据集:
- 提取时间部分
# 从已转换的Datetime列中提取纯时间部分 time_part = dfsched['Actual Time'].dt.time
- 设置基准日期并标记跨天情况
# 第一行的目标基准日期 start_date = pd.to_datetime('2023-11-12') # 判断当前行时间是否早于前一行,标记为跨天 cross_day = time_part < time_part.shift(1) # 累计跨天次数,得到每行需要额外增加的天数 day_offset = cross_day.cumsum()
- 生成最终完整日期时间
# 组合基准日期、天数偏移和时间部分 dfsched['Actual Time'] = start_date + day_offset.astype('timedelta64[D]') + pd.to_timedelta(time_part.astype(str))
方法二:逐行遍历处理(适合小型数据集)
如果数据量不大,也可以逐行判断跨天:
# 替换第一行的日期为目标日期 dfsched.loc[0, 'Actual Time'] = pd.to_datetime('2023-11-12 ' + dfsched.loc[0, 'Actual Time'].strftime('%H:%M')) # 从第二行开始遍历处理 for i in range(1, len(dfsched)): current_time = pd.to_datetime(dfsched.loc[i, 'Actual Time'].strftime('%H:%M')).time() prev_datetime = dfsched.loc[i-1, 'Actual Time'] # 时间早于前一行则跨天,日期加1 if current_time < prev_datetime.time(): new_date = prev_datetime + pd.Timedelta(days=1) dfsched.loc[i, 'Actual Time'] = new_date.replace(hour=current_time.hour, minute=current_time.minute) else: # 不跨天则沿用前一行日期 dfsched.loc[i, 'Actual Time'] = prev_datetime.replace(hour=current_time.hour, minute=current_time.minute)
说明
- 方法一通过向量运算实现,处理速度远快于循环,优先推荐。
- 两种方法都能自动识别跨天:当当前行时间早于前一行时,自动将日期递增1天。
内容的提问来源于stack exchange,提问作者user3042850
相关产品推荐
相关产品推荐

