如何让Pandas读取CSV文件的实际值而非显示值——解决日期列解析ParserError问题
解决Pandas解析含超额小时的CSV日期列问题
我太懂你这种头疼的情况了——CSV里明明白白写着30:30:01、45:42:7这种明显无效的时间,双击Excel行却能显示正确的日期时间,可Pandas一解析就报错。核心原因其实是:
CSV是纯文本格式,文件里确实存着这些带超额小时的字符串;Excel的日期时间引擎会自动把超出24的小时转换成「天数+剩余小时」(比如30小时=1天6小时),但Pandas默认的pd.to_datetime不支持这种非常规格式,所以直接抛出了ParserError。
下面是针对批量CSV文件的解决方案,能让Pandas像Excel一样解析出正确的日期时间:
步骤1:读取CSV时保留日期列的字符串格式
先把所有CSV文件读进来,确保Date列以字符串形式加载,避免Pandas自动解析时直接报错:
import pandas as pd from datetime import datetime, timedelta import glob # 获取目标文件夹下所有CSV文件路径 csv_files = glob.glob('your/csv/folder/path/*.csv') # 批量读取,统一指定Date列为字符串类型 dfs_list = [] for file in csv_files: df = pd.read_csv(file, dtype={'Date': str}) dfs_list.append(df) # 合并所有DataFrame(如果需要统一处理的话) combined_df = pd.concat(dfs_list, ignore_index=True)
步骤2:自定义解析函数处理超额小时
写一个函数,手动拆分日期和时间部分,把超额的小时转换成天数加到日期上:
def parse_weird_datetime(date_str): # 拆分日期和时间部分(处理部分行只有日期的情况) split_parts = date_str.split(' ', 1) date_part = split_parts[0] time_part = split_parts[1] if len(split_parts) > 1 else '00:00:00' # 解析基础日期(格式对应你的dd/mm/yyyy) base_date = datetime.strptime(date_part, '%d/%m/%Y') # 解析时间部分,兼容小时>24、秒数为整数的情况 time_components = time_part.split(':') hours = int(time_components[0]) minutes = int(time_components[1]) if len(time_components) >= 2 else 0 # 处理类似7这样的秒数(不是07),先转float再转int避免报错 seconds = int(float(time_components[2])) if len(time_components) >= 3 else 0 # 计算时间差(自动把超额小时转换成天数) time_delta = timedelta(hours=hours, minutes=minutes, seconds=seconds) # 合并日期和时间差,得到正确的日期时间 return base_date + time_delta
步骤3:应用解析函数转换日期列
把自定义函数应用到Date列上,替换原来的字符串:
combined_df['Date'] = combined_df['Date'].apply(parse_weird_datetime)
这样处理后,所有带超额小时的日期字符串都会被转换成正确的datetime对象,比如:
11/01/1985 30:30:01→1985-01-12 06:30:0126/02/1976 45:42:7→1976-02-27 21:42:07
完全和Excel双击后显示的正确值一致,而且能批量处理几十份CSV文件,不用手动操作。
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

