Pandas如何按条件为小时数据匹配对应日期并转标准datetime格式
时间列转换实现方案
针对1行日期+后续24行小时的循环排布时间列,不需要拆分两个DataFrame循环匹配,用前向填充日期的方法可以一次性完成转换,不会触发赋值警告也不会出现索引错位。
核心逻辑
利用数据每25行一个周期的规律,先提取所有日期行的标准日期值,将非日期行的日期位置设为空值,再向下填充日期到后续24个小时行,最后拼接日期和小时生成标准datetime格式即可。
可直接运行的代码
import pandas as pd import numpy as np # 提取日期部分:带/的行解析为日期,其余行设为空值 df1['date_part'] = pd.to_datetime( np.where(df1['Hour'].str.contains('/'), df1['Hour'], np.nan), format="%d/%m/%Y" ) # 向下填充日期,每个日期自动覆盖后续24条小时数据 df1['date_part'] = df1['date_part'].ffill() # 提取小时数值:匹配xh格式中的数字部分 df1['hour_part'] = pd.to_numeric( df1['Hour'].str.extract(r'(\d+)h')[0], errors='coerce' ) # 过滤掉原始的日期行(小时值为空),拼接生成标准时间列 df_result = df1.dropna(subset=['hour_part']).copy() df_result['datetime'] = df_result['date_part'] + pd.to_timedelta(df_result['hour_part'], unit='h')
最终df_result['datetime']列即为YY-MM-DD HH:MM:SS格式的pandas datetime类型数据,可直接用于时间序列计算。
原有代码问题说明
- 链式赋值警告:
df4['year'].iloc[...] = ...属于典型的链式索引操作,pandas无法确认操作对象是原DataFrame的视图还是独立副本,会抛出警告,赋值结果也可能无法写入原表。 - 索引匹配错误:重置df2、df3索引后,df3的索引变为0、1、2…的连续值,不再保留原始数据中0、25、50…的位置标记,切片时自然会出现错位。
- 小时转换逻辑冗余:先转datetime再转字符串拆分取时间部分的写法多了3次不必要的类型转换,不仅效率低还容易引入格式错误。
结果校验
运行以下代码查看前30条结果,可确认日期和小时匹配关系正确:
print(df_result[['Hour', 'datetime']].head(30))
内容的提问来源于stack exchange,提问作者Jorisltc
相关产品推荐
相关产品推荐

