Python实现dd-mm-yyyy hh:mm格式时间戳比较及Excel数据处理问题
问题解决:Excel时间戳比较返回异常值(全0/全1/NaN)
需求与问题
需要编写Python程序,比较格式为dd-mm-yyyy hh:mm的两个时间戳,返回0或1。具体需求:从Excel导入数据后,将A列每行数据与C1单元格的时间比较,若A列数据大于C1则在对应C列位置填1,否则填0。但现有代码运行后输出全0、全1或NaN,结果不符合预期。
用户原代码
import pandas as pd import numpy as np # Read the Excel sheet into a pandas DataFrame df = pd.read_excel('MAT_TEST3.xlsx') # Convert date and time columns to datetime objects using positional index df.iloc[:, 0] = pd.to_datetime(df.iloc[:, 0], format='%d-%m-%Y %H:%M', errors='coerce') df.iloc[:, 1] = pd.to_datetime(df.iloc[:, 1], format='%d-%m-%Y %H:%M', errors='coerce') df.iloc[:, 2] = pd.to_datetime(df.iloc[:, 2], format='%d-%m-%Y %H:%M', errors='coerce') # Compare dates and times and create a new column at the last position df.iloc[:, 2] = (df.iloc[:, 0] > df.iloc[:, 2]).astype(int) print(df) # Save the modified DataFrame back to Excel #df.to_excel('MAT_TEST3_OP.xlsx', index=False)
原代码输出
DEP_DATE_TIME ARR_DATE_TIME 2024-01-05 03:59:59.545000 \ 0 2024-01-05 03:13:00 2024-01-05 11:23:00 0 1 2024-01-06 02:35:00 2024-01-06 11:30:00 0 2 2024-01-07 02:35:00 2024-01-07 11:30:00 0 3 2024-01-05 14:30:00 2024-01-06 00:25:00 0 4 2024-01-06 14:30:00 2024-01-07 00:25:00 0 5 2024-01-07 14:30:00 2024-01-08 00:25:00 0 2024-01-05 04:59:59.580000 2024-01-05 05:59:59.615000 \ 0 NaN NaN 1 NaN NaN 2 NaN NaN 3 NaN NaN 4 NaN NaN 5 NaN NaN 2024-01-05 06:59:59.650000 0 NaN 1 NaN 2 NaN 3 NaN 4 NaN 5 NaN
错误原因
- 比较基准错误:原代码将C列所有行转为datetime后,用A列每行和C列对应行比较,而非和C1单元格的单个固定值比较。
- 不必要的列转换:转换了不需要用到的B列(ARR_DATE_TIME),且C列转换后被后续赋值覆盖,逻辑混乱。
- 列索引混淆:使用
iloc[:,2]操作时,未明确C1的定位,导致比较逻辑偏离需求。
修正后的代码
import pandas as pd # 读取Excel文件 df = pd.read_excel('MAT_TEST3.xlsx') # 转换A列为datetime类型(对应DEP_DATE_TIME列) df['DEP_DATE_TIME'] = pd.to_datetime(df['DEP_DATE_TIME'], format='%d-%m-%Y %H:%M', errors='coerce') # 获取C1单元格的时间值并转换为datetime格式 c1_time = pd.to_datetime(df.iloc[0, 2], format='%d-%m-%Y %H:%M', errors='coerce') # 执行比较:A列每行大于C1则返回1,否则0,结果写入C列 df.iloc[:, 2] = (df['DEP_DATE_TIME'] > c1_time).astype(int) print(df) # 保存结果到Excel(取消注释即可执行) # df.to_excel('MAT_TEST3_OP.xlsx', index=False)
修正说明
- 明确比较基准:单独提取C1单元格的值作为固定比较基准,确保所有行都和同一个时间点对比。
- 精简转换操作:只转换需要用到的A列,避免无效操作和数据混淆。
- 直观列引用:使用列名
DEP_DATE_TIME替代位置索引,提升代码可读性;若需保持位置索引,可替换为df.iloc[:,0]。 - 错误处理保留:
errors='coerce'会将无效时间格式转为NaT,这类值和任何时间比较都会返回False,最终对应0;若需处理无效数据,可额外添加判断逻辑。
内容的提问来源于stack exchange,提问作者r anderson
相关产品推荐
相关产品推荐

