如何读取Excel文件且不改变原有日期格式?
解决Excel日期读取保留原格式的问题
方法1:读取日期序列号后按原格式转换
Excel的日期本质是数值(序列号),col_types="text"会直接读取这个数值的文本形式,所以要先读取为数值,再根据原Excel的日期格式来格式化字符串。
示例代码:
import pandas as pd from datetime import datetime # 先读取数据,目标日期列按数值类型读取 df = pd.read_excel("your_file.xlsx", col_types={"date_column": "float"}) # 替换成你Excel里实际的日期格式,比如"yyyy年mm月dd日"或"mm/dd/yyyy" df["date_column"] = df["date_column"].apply( lambda x: datetime.fromordinal(datetime(1900, 1, 1).toordinal() + int(x) - 2).strftime("%Y年%m月%d日") )
注:Excel的日期序列号从1900-01-01开始,但存在闰年bug(误将1900年判定为闰年),所以要减2修正。若你的日期都在1900-03-01之后,减1也可正常工作,但减2适配所有情况。
方法2:用openpyxl直接读取单元格显示文本
使用openpyxl引擎可以直接读取单元格的显示值,无需手动处理序列号:
import pandas as pd from openpyxl import load_workbook # 先读取基础DataFrame df = pd.read_excel("your_file.xlsx", engine="openpyxl") # 加载工作簿,获取目标列的显示文本 wb = load_workbook("your_file.xlsx") ws = wb.active # 假设日期列是第2列(从1开始计数),跳过表头行 date_display_texts = [cell.value for cell in ws["B"][1:]] # 替换DataFrame中的日期列 df["date_column"] = date_display_texts
更直接的方式,用openpyxl读取后直接构建DataFrame:
from openpyxl import load_workbook import pandas as pd # data_only=False 会读取单元格的显示格式而非计算后的值 wb = load_workbook("your_file.xlsx", data_only=False) ws = wb.active data = [] for row in ws.iter_rows(values_only=False): row_data = [] for cell in row: if cell.data_type == 'd': # 用单元格自带的格式规则格式化日期值 row_data.append(cell.number_format.format(cell.value)) else: row_data.append(cell.value) data.append(row_data) # 转成DataFrame,第一行作为表头 df = pd.DataFrame(data[1:], columns=[cell.value for cell in data[0]])
方法3:自定义date_parser解析函数
如果明确原日期的显示格式,可在读取时指定自定义解析函数,将序列号转成对应格式的字符串:
import pandas as pd from datetime import datetime def custom_date_parser(serial_num): # 将Excel序列号转成datetime,再格式化为目标字符串 dt = datetime.fromordinal(datetime(1900, 1, 1).toordinal() + int(serial_num) - 2) return dt.strftime("%m/%d/%Y") # 替换为你的原日期格式 df = pd.read_excel("your_file.xlsx", parse_dates=["date_column"], date_parser=custom_date_parser)
内容的提问来源于stack exchange,提问作者Stataq
相关产品推荐
相关产品推荐

