求助:使用Pandas处理Excel时间数据的格式与识别问题
用Pandas修正Excel时间数据的问题解决
需求场景
需要修正Excel中的时间数据,原始表格与期望结果如下:
原始表格
| ArrivalDate | ArrivalTime |
|---|---|
| 2024-01-01 | 2024-01-01 12:00:01 PM |
| 2024-04-01 | 1990-01-00 12:01:00 PM |
| 2024-03-01 | 12:03:15 AM |
| 2024-01-01 | 1990-01-00 |
| 2024-04-01 |
期望表格
| ArrivalDate | ArrivalTime |
|---|---|
| 2024-01-01 | 2024-01-01 12:00:01 PM |
| 2024-04-01 | 2024-04-01 12:01:00 PM |
| 2024-03-01 | 2024-03-01 12:03:15 AM |
| 2024-01-01 | Missing Time |
| 2024-04-01 | Need more Info |
原代码问题分析
你编写的代码存在以下问题:
- 读取Excel的方法错误,应为
pd.read_excel()而非pd.read.excel(); - 列名未加引号,如
df[ArrivalDate]应改为df['ArrivalDate']; - 处理
ArrivalTime时使用单一格式解析,无法匹配多种时间格式,且1990-01-00是无效日期,直接用pd.to_datetime会返回NaT; - 最终生成的是datetime对象,Pandas默认以24小时制显示,不符合带AM/PM的格式要求。
修正后的代码
import pandas as pd # 读取Excel文件,替换为你的文件路径 df = pd.read_excel("path/excelfile.xls") # 转换ArrivalDate列为datetime格式 df['ArrivalDate'] = pd.to_datetime(df['ArrivalDate']) def process_arrival_time(row): arrival_time = row['ArrivalTime'] arrival_date = row['ArrivalDate'] # 处理空值情况 if pd.isna(arrival_time): return "Need more Info" time_str = str(arrival_time).strip() # 处理1990-01-00开头的记录 if time_str.startswith("1990-01-00"): # 拆分出时间部分(存在时间的情况) time_part = time_str.split(" ", 1)[-1] if " " in time_str else "" if not time_part: return "Missing Time" # 组合日期与时间,转换为目标格式 full_datetime = pd.to_datetime(f"{arrival_date.date()} {time_part}") return full_datetime.strftime("%Y-%m-%d %I:%M:%S %p") # 处理只有时间的记录 elif ":" in time_str and "-" not in time_str: full_datetime = pd.to_datetime(f"{arrival_date.date()} {time_str}") return full_datetime.strftime("%Y-%m-%d %I:%M:%S %p") # 处理已有正确日期的时间记录 elif "-" in time_str and ":" in time_str: try: dt = pd.to_datetime(time_str) return dt.strftime("%Y-%m-%d %I:%M:%S %p") except: return "Need more Info" # 处理仅1990-01-00无时间的情况 elif time_str == "1990-01-00": return "Missing Time" # 其他异常情况 else: return "Need more Info" # 应用处理函数到每一行 df['ArrivalTime'] = df.apply(process_arrival_time, axis=1) print(df)
关键修复点说明
- 格式显示问题解决:通过
strftime("%Y-%m-%d %I:%M:%S %p")将datetime对象转换为12小时制带AM/PM的字符串,%I对应12小时制小时,%p自动识别上午/下午。 - 1990-01-00无效日期处理:直接通过字符串前缀判断,拆分出时间部分后与
ArrivalDate的日期组合,避免直接解析无效日期导致的NaT。 - 边界场景覆盖:分别处理空值、仅时间、仅无效日期、完整时间等多种情况,对应标记"Need more Info"或"Missing Time"。
内容的提问来源于stack exchange,提问作者Rob J
相关产品推荐
相关产品推荐

