[英]How to set borders to the data to the excel with Python pandas/XLSX writer
[英]Python Pandas and excel xlsx cell formats
所以我需要做的是将 xlsx 文件获取到 pandas dataframe 然后用它做一些事情并将其保存为 xlsx 文件。
我是怎么做的:
import pandas as pd
from openpyxl import load_workbook
from datetime import datetime
path = r'D:\Test\Test.xlsx'
path2 = r'D:\Test\TestResult.xlsx'
dataFrame = pd.read_excel(path, sheet_name=0, index_col=None, na_values=['NA'])
print(dataFrame.dtypes)
dataFrame.Hours = pd.to_datetime(dataFrame.Hours, format='%H:%M:%S').dt.time
print(dataFrame.dtypes)
book = load_workbook(path)
firstSheetName = book.sheetnames[0]
ws = book.get_sheet_by_name(firstSheetName)
book.remove(ws)
book.create_sheet(firstSheetName, 0)
writer = pd.ExcelWriter(path2, engine='openpyxl', date_format='yyyy-mm-dd')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
dataFrame.to_excel(writer, sheet_name=firstSheetName, index=False)
writer.save()
到目前为止一切正常,文件被保存等。但我遇到的问题是在基本文件 Test.xlsx 中,我的“时间”列是自定义类型(hh:mm:ss),当我将它导入到 dataframe 时,它是识别为“对象”类型。 此外,当我将该数据保存回 excel testResult.xlsx 时,此列更改为“常规”。
我试图使用下面的代码将 dataframe 中的“对象”类型更改为“日期时间”类型,但它没有效果,小时仍然显示为“对象”:
dataFrame.Hours = pd.to_datetime(dataFrame.Hours, format='%H:%M:%S').dt.time
所以我需要帮助的是,如何将 dataframe 保存回 excel xlsx 文件,其中“小时”列设置为自定义“hh:mm:ss”???
Excel 文件是 Test.xlsx ,它在里面的样子:
https://docs.google.com/spreadsheets/d/1uu7g7xmMKy51BHpy0Up3T47VTHwtH9U_9PdlBSlaK80/edit?usp=sharing
“小时”列是自定义类型“hh:mm:ss”
删除.dt.time
,可以转换为datetime64
您可以利用.ExcelWriter()
[pandas-doc]中的date_format
和datetime_format
参数
只需相应地格式化列。 在您的情况下, FromDate
和ToDate
到datetime.date
对象,以及Hours
到datetime.datetime
对象。
df['FromDate'] = df['FromDate'].dt.date
df['ToDate'] = df['ToDate'].dt.date
df['Hours'] = pd.to_datetime(df['Hours'], format='%H:%M:%S')
然后指定output格式:
pd.ExcelWriter(path2, engine='openpyxl', date_format='yyyy-mm-dd', datetime_format='hh:mm:ss')
好的,经过数小时的尝试,我找到了解决方案。 非常感谢 @afonso 帮助我将该字符串转换为数据时间类型。
我仍然遇到的问题是由于转换后 python 将日期设置为“1900-01-01 23:59:50”而 excel 将其读取为 1.324324243(日期和时间格式)而不是时间格式 -0.123(仅日期看起来像“1900-0-0 23:59:50”)。
所以我所做的是使用 excel “错误”无法读取低于 1900 年的日期,并使用以下代码从我的 python 日期时间中减去一天:
dataFrame['Hours'] = dataFrame['Hours'] + pd.Timedelta(days=-1)
这导致发送到 excel 日期“1899-12-31 23:59:50”,并且由于 excel 无法读取该日期,因为它自动将其更改为“1900-01-00 23:59:50”并解决了这个问题问题,因为这正是我从 excel 输入的格式。
非常感谢大家的帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.