Python:带格式导出DataFrame至Excel及日期列仅显日期的方法
问题1:如何在Python中带格式将DataFrame导出至Excel?
要实现带格式导出,最常用的方案是结合pandas.ExcelWriter和Excel引擎(比如xlsxwriter或openpyxl),这样你能灵活自定义单元格样式、列宽、表头格式等细节。下面是个实用的实操示例:
先确保安装好依赖库:
pip install pandas xlsxwriter示例代码:
import pandas as pd from datetime import datetime # 构造示例DataFrame data = { "日期": [datetime(2024, 1, 1), datetime(2024, 1, 2)], "销售额": [1000, 1500], "备注": ["正常", "促销"] } df = pd.DataFrame(data) # 创建ExcelWriter对象,指定xlsxwriter引擎 with pd.ExcelWriter(r'D:\Users\Desktop\CPS.xlsx', engine='xlsxwriter') as writer: df.to_excel(writer, index=False, sheet_name='数据') # 获取工作簿和工作表对象,用于自定义格式 workbook = writer.book worksheet = writer.sheets['数据'] # 定义不同场景的格式:表头加粗居中、日期列格式、数值列格式 header_format = workbook.add_format({'bold': True, 'align': 'center', 'valign': 'vcenter', 'border': 1}) date_format = workbook.add_format({'num_format': 'yyyy-mm-dd', 'border': 1}) number_format = workbook.add_format({'num_format': '#,##0', 'border': 1}) # 给表头应用格式 for col_num, value in enumerate(df.columns.values): worksheet.write(0, col_num, value, header_format) # 设置列宽和对应列的格式 worksheet.set_column('A:A', 12, date_format) # 日期列 worksheet.set_column('B:B', 10, number_format) # 销售额列 worksheet.set_column('C:C', 10) # 备注列
这个例子里,我们不仅完成了数据导出,还自定义了表头样式、日期和数值的显示格式,同时调整了列宽,让导出的Excel表格更规整美观。
问题2:导出后日期列同时显示日期和时间,如何仅显示日期但保留原数据格式?
你的需求核心是保留原始datetime数据的完整性,只是让Excel仅显示日期部分。这种情况完全不需要修改DataFrame里的原始数据,只需要在导出时给日期列设置对应的Excel单元格显示格式就行:
下面是针对你场景的修改代码:
import pandas as pd # 假设你的df已经存在,包含两列日期值 # df = pd.read_csv('你的数据源路径.csv') # 替换成你的实际数据读取方式 with pd.ExcelWriter(r'D:\Users\Desktop\CPS.xlsx', engine='xlsxwriter') as writer: df.to_excel(writer, index=False, sheet_name='数据') workbook = writer.book worksheet = writer.sheets['数据'] # 定义仅显示日期的格式(可以改成你需要的格式,比如mm/dd/yyyy) date_only_format = workbook.add_format({'num_format': 'yyyy-mm-dd'}) # 方法1:按列索引设置(假设日期列是第0和第1列,根据实际调整) worksheet.set_column(0, 1, 12, date_only_format) # 方法2:按列名设置(更直观,推荐) # date_cols = ['你的日期列名1', '你的日期列名2'] # 替换成实际列名 # for col_name in date_cols: # col_idx = df.columns.get_loc(col_name) # worksheet.set_column(col_idx, col_idx, 12, date_only_format)
这样导出后,Excel里的日期列只会显示日期部分,但你双击单元格查看原始数据时,时间信息依然存在——因为我们只是修改了单元格的显示格式,并没有改动DataFrame里的datetime原始数据。
如果你的日期列在DataFrame里是字符串类型,建议先转成datetime类型再导出,这样后续在Excel里也能方便进行日期相关操作:
df['日期列1'] = pd.to_datetime(df['日期列1']) df['日期列2'] = pd.to_datetime(df['日期列2'])
内容的提问来源于stack exchange,提问作者Sandeep Bhatt




