You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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  

错误原因

  1. 比较基准错误:原代码将C列所有行转为datetime后,用A列每行和C列对应行比较,而非和C1单元格的单个固定值比较。
  2. 不必要的列转换:转换了不需要用到的B列(ARR_DATE_TIME),且C列转换后被后续赋值覆盖,逻辑混乱。
  3. 列索引混淆:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:57:18