将Time&Date列内独立日期行及后续AM/PM时间转换为完整Timestamp列
拆分存储结构时间日期列转标准时间戳处理方案
问题特征
这类非结构化表格是经济数据日历类导出文件的常见格式,核心的拆分存储规则为:
Time & Date列未逐行填充完整时间,而是按“日期-明细”的层级拆分存储- 层级顶部的日期标识行:
Time & Date存储完整自然日文本,示例格式为Tuesday April 02 2019Country字段为空值(NaN)Consensus、Forecast字段为重复的表头文本,无实际业务值
- 日期行下方关联的明细数据行:
Time & Date仅存储带AM/PM标识的12小时制时间,示例格式为4:00 PM、7:00 AMCountry、Consensus、Forecast等业务字段为实际填充的有效数据
处理逻辑
通过向下继承日期值的方式完成时间字段的补全,最终生成逐行对应的高精度时间戳:
- 逐行遍历表格记录,识别所有日期标识行
- 遇到日期行时,将该行的自然日文本解析为日期值,作为后续明细行的继承基准,遇到下一个日期行时再更新该基准值
- 跳过所有无实际业务值的日期标识行,不对其做数据保留
- 对每一条有效明细行,将继承到的自然日值与该行自身存储的时间文本拼接,转换为带年、月、日、时、分精度的标准Timestamp对象
参考实现代码(基于Pandas)
import pandas as pd current_effective_date = None generated_timestamp_list = [] for _, row in raw_df.iterrows(): # 识别日期行:Country字段为空 if pd.isna(row["Country"]): # 解析该行存储的完整日期文本 current_effective_date = pd.to_datetime(row["Time & Date"]).date() continue # 拼接有效明细行的完整时间字符串 full_time_text = f"{current_effective_date} {row['Time & Date']}" # 转换为标准Timestamp,适配12小时制+AM/PM的格式 parsed_timestamp = pd.to_datetime(full_time_text, format="%Y-%m-%d %I:%M %p") generated_timestamp_list.append(parsed_timestamp) # 过滤无效行,绑定生成的时间戳列 valid_df = raw_df.dropna(subset=["Country"]).reset_index(drop=True) valid_df["Timestamp"] = generated_timestamp_list
关键注意点
- 解析带AM/PM的12小时制时间时,必须使用
%I格式占位符对应12小时制小时位,不要误用24小时制的%H,否则会出现时间解析偏移 - 遍历过程中需要对孤立的无日期关联的时间行做异常校验,避免错误继承跨天的旧日期值
- 最终输出前需要二次校验时间戳的连续性,避免因为表格排序错位导致日期继承错误
内容的提问来源于stack exchange,提问作者Andrey Kurnikovs
相关产品推荐
相关产品推荐

