繁体   English   中英

Python Pandas 和 excel xlsx 单元格格式

[英]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_formatdatetime_format参数

只需相应地格式化列。 在您的情况下, FromDateToDatedatetime.date对象,以及Hoursdatetime.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM