Pandas读取Excel生成DataFrame时日期列带多余零如何处理

问题原因
你调用pd.read_excel时指定了全局dtype=str参数,Excel中原本为 datetime 类型的单元格会先被解析为Timestamp对象,再强制转为字符串时就会自动带上多余的.0后缀。
另外你当前代码的执行顺序存在问题:pd.read_excel逻辑写在了for循环外部,此时header、sheet_name等配置参数还没有被赋值,运行会直接报错,需要把读取逻辑挪到for循环内部。
解决方案
方案1:自动识别日期类型,后续统一格式化(推荐)
不需要强制全局读为字符串,pandas会自动识别日期列,后续按需转成标准格式的日期字符串即可:
for object in json_meta_data: header = object['excel_header'] - 1 excel_filename = object['excel_filename'] sheet_name = object['excel_sheet_name'] usecols = object['excel_usecols'] nrows = object['excel_nrows'] # 读取时不指定dtype=str,自动识别类型 df = pd.read_excel( full_excel_path, sheet_name=sheet_name, engine='openpyxl', header=header, usecols=usecols, nrows=nrows ) # 所有自动识别的日期列统一转成你需要的字符串格式,比如%Y-%m-%d仅保留日期 for date_col in df.select_dtypes(include='datetime64').columns: df[date_col] = df[date_col].dt.strftime('%Y-%m-%d') dataframes.append(df)
方案2:强制全列读为字符串,批量清洗后缀
如果业务要求必须所有列都读取为字符串格式,可以在读入后批量替换掉所有末尾的.0:
for object in json_meta_data: header = object['excel_header'] - 1 excel_filename = object['excel_filename'] sheet_name = object['excel_sheet_name'] usecols = object['excel_usecols'] nrows = object['excel_nrows'] df = pd.read_excel( full_excel_path, sheet_name=sheet_name, engine='openpyxl', header=header, usecols=usecols, nrows=nrows, dtype=str ) # 正则替换所有列中末尾的.0 df = df.replace(r'\.0$', '', regex=True) dataframes.append(df)
内容的提问来源于stack exchange,提问作者amine jisung
相关产品推荐
相关产品推荐

