我正在使用 PDF4me API 将 PDF 发票转换为 Excel 文件。 API 可以正确读取日期。但是,当我打开 Excel 文件时,日期显示不一致:
-
某些日期以正确的格式 (dd/mm/yyyy) 显示,而其他日期以错误的 mm/dd/yyyy 格式显示。当该月的某天小于或等于 12 时,似乎会出现这种不一致。
-
尽管格式不正确的日期最初显示为 dd/mm/yyyy,但当我单击单元格时,它们会恢复为 mm/dd/yyyy .
-
如果我将 Excel 文件转换为 CSV,所有日期均以正确的 dd/mm/yyyy 格式显示。 期望的行为:
-
我希望 Excel 文件中的所有日期格式一致为 dd/mm/yyyy,无论该月的哪一天是否小于或等于 12。这也应该与 Pandas 的读取方式一致
当前行为:
当我将 Excel 文件读入 Pandas DataFrame 时,日期格式不一致会导致我的分析出现问题。我无法手动更正这些问题,因为 Excel 文件是自动生成的。
附加说明:
- PDF 发票本身的日期格式是正确的 dd/mm/yyyy。
- 我怀疑这是由于 Excel 自动生成的基于区域设置的日期格式。
- 我无法直接控制 PDF4me API 的 Excel 生成过程。
问题: 如何确保 Excel 文件中的日期格式一致为 dd/mm/yyyy读入 Pandas,或者如何让 Pandas 正确读取日期,尽管存在不一致?
示例数据:
发票日期(Excel 显示) | 发票日期(单击时的实际值) |
---|---|
20/07 /2024 | 20/07/2024 |
04/06/2024 | 06/04/2024 |
代码块:(已尝试以下选项)
# Read the Excel file into a DataFrame
xls = pd.ExcelFile(excel_path)
for sheet_name in xls.sheet_names[:-1]:
df = pd.read_excel(xls, sheet_name=sheet_name,
date_format="%d.%m.%Y")
# Tried this in old versions
df = pd.read_excel(xls, sheet_name=sheet_name,
date_format="%d.%m.%Y", dayfirst=True)
Excel 屏幕截图
[![在这种情况下,可见日期与实际值相同][1]][1] [1]: https://i.sstatic.net/Zfa2HdmS.png
[![在这种情况下,可见日期的格式不同][2]][2] [2]:https://i.sstatic.net/JfGA8Ya2.png
理解面临的挑战。问题在于 Excel 将某些日期解释为美国格式 (mm/dd/yyyy),而其他日期则解释为的预期格式 (dd/mm/yyyy)。由于无法控制 Excel 生成过程,我们可以尝试在 Pandas 中解决此问题。
以下是 Pandas 解决此问题的步骤:
-
将有问题的列读取为字符串: 这可以防止 Pandas 自动将日期解释为日期时间对象。
-
使用 Pandas 的
to_datetime
函数转换日期:to_datetime
函数有一个参数dayfirst
,可以用来强制将日期解释为以日为先。
```python import pandas as pd
# 将 Excel 文件读入 Pandas DataFrame df = pd.read_excel("your_excel_file.xlsx", dtype={'Invoice Date': str})
# 将“Invoice Date”列转换为日期时间对象,强制以日为先 df['Invoice Date'] = pd.to_datetime(df['Invoice Date'], dayfirst=True) print(df) ```
这应该可以将“Invoice Date”列中的所有日期转换为正确的格式,无论它们最初是如何在 Excel 中格式化的。
其他提示:
-
检查空值:
在转换日期之前,最好检查的数据中是否有任何空值或 NA 值,因为这些值可能会导致错误。可以使用
df.isnull().sum()
来检查每一列中的空值。 -
处理错误:
如果
to_datetime
函数无法解析某些日期,可以使用errors='coerce'
参数将它们强制转换为NaT
(非时间戳)。然后,可以分别处理这些错误。
请记住: 这种方法假设的日期始终以两位数的天数表示(例如,01、02、... 10、11 ...)。如果的日期包含一位数的天数(例如,1、2、... 10、11 ...),则需要调整代码以考虑这种情况。
我希望这有帮助!如果还有其他问题,请告诉我。
标签:python,excel,pandas,date,formatting From: 78772581