【问题标题】:Python Pandas and excel xlsx cell formatsPython Pandas 和 excel xlsx 单元格格式
【发布时间】:2021-06-21 02:19:24
【问题描述】:

所以我需要做的是将 xlsx 文件获取到 pandas 数据框,然后对其进行一些处理并将其保存为 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),当我将它导入数据框时,它被识别为“对象”类型。 此外,当我将该数据保存回 excel testResult.xlsx 时,此列将更改为“常规”。

我试图使用下面的代码将数据框中的“对象”类型更改为“日期时间”类型,但没有效果,小时仍然显示为“对象”:

dataFrame.Hours = pd.to_datetime(dataFrame.Hours, format='%H:%M:%S').dt.time

所以我需要帮助的是,如何将该数据框保存回 excel xlsx 文件,其中“小时”列设置为自定义“hh:mm:ss”???

Excel 文件是 Test.xlsx 以及它的内部外观:

https://docs.google.com/spreadsheets/d/1uu7g7xmMKy51BHpy0Up3T47VTHwtH9U_9PdlBSlaK80/edit?usp=sharing

“小时”列是自定义类型“hh:mm:ss”

【问题讨论】:

    标签: python excel pandas dataframe


    【解决方案1】:

    您可以利用.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')
    

    然后指定输出格式:

    pd.ExcelWriter(path2, engine='openpyxl', <b>date_format='yyyy-mm-dd', datetime_format='hh:mm:ss'</b>)

    【讨论】:

    • 它确实改变了格式,但导致 excel 文件仍然是错误的。在它以这种自定义格式只显示几个小时之前。现在,当您单击单元格进行编辑时,它会显示日期 1900-01-01 23:59:50。我需要在没有那个日期的情况下得到我的结果。
    【解决方案2】:

    删除.dt.time,可以转换成datetime64

    【讨论】:

      【解决方案3】:

      好的,经过数小时的尝试,我找到了解决方案。非常感谢 @afonso 帮助我将该字符串转换为数据时间类型。

      我仍然遇到的问题是由于转换后 python 将日期设置为“1900-01-01 23:59:50”而 excel 将其读取为 1.324324243(日期和时间格式)而不是 0.1234325(仅时间格式 - 作为日期,它看起来像“1900-0-0 23:59:50”)。

      所以我所做的是使用无法读取 1900 年以下日期的 excel“错误”并使用此代码从我的 python 日期时间中减去一天:

      dataFrame['Hours'] = dataFrame['Hours'] + pd.Timedelta(days=-1)
      

      这导致发送到 excel 日期“1899-12-31 23:59:50”,并且由于 excel 无法将该日期读取为日期,它自动将其更改为“1900-01-00 23:59:50”和这解决了我的问题,因为这正是我从 excel 输入的格式。

      非常感谢大家的帮助。

      【讨论】:

        猜你喜欢
        • 2017-10-24
        • 1970-01-01
        • 1970-01-01
        • 2016-04-07
        • 1970-01-01
        • 2023-03-20
        • 2018-02-28
        • 1970-01-01
        • 2017-06-03
        相关资源
        最近更新 更多