gpt4 book ai didi

Python 从 Excel 日期/时间字段读取不准确

转载 作者:太空宇宙 更新时间:2023-11-03 20:30:42 26 4
gpt4 key购买 nike

我正在尝试读取 OpenPyXL 的 Excel 文件,但日期/时间字段中的值不准确。

import openpyxl

wb = openpyxl.load_workbook('doc.xlsx')
ws = wb.active

for rowNum in range(2, ws.max_row + 1):
date = ws['A' + str(rowNum)].value
print(date)

Excel数据:2019-08-16 06:55:00

我在Python中获得的值:2019-08-16 06:54:59.999996

如何准确读取日期/时间字段?

最佳答案

问题

According to this issue ,问题是Excel实现的结果;不是 OpenPyXL 的:

The XLSX file format cannot be relied upon to store dates and times accurately. These are always converted internally to a serial form of limited precision.

解决方法选项 1:文本

您可以将这些值表示为 Excel 中的文本和 then parse that text 。例如...

假设单元格 A2 中有一个日期值,其自定义格式为“m/d/yy h:mm:ss”:

19年8月16日6:55:00

在单独的列中,您可以编写公式

=TEXT(A2,"yyyy-mm-dd")&"T"&TEXT(A2,"hh:mm:ss")

并复制到该列中的其他单元格,结果

2019-08-16T06:55:00

如果您不需要这个单独的列,只需将新文本列中的复制并粘贴到 A 列即可覆盖该列。

现在,当您读取值时,您需要小心使用选项 data_only=Trueopenpyxl.load_workbook这样你就可以阅读文本的实际值;不是公式。

import openpyxl

wb = openpyxl.load_workbook('doc.xlsx', data_only=True)
ws = wb.active

for rowNum in range(2, ws.max_row + 1):
date = ws['A' + str(rowNum)].value
print(date)

然后解析date中的文本according to the ISO 8601 format .

解决方法选项 2:四舍五入

文本选项的一个缺点是它需要在 Excel 电子表格中进行更多工作。如果您知道所需的精度,则可以让 Python 为您舍入这些值。

但是

小心应该小心!如果所需的精度太小,Excel 方面缺乏精度可能会导致四舍五入到不正确的数字。对于复合公式尤其如此,例如 =<above cell>+1/24 .

参见this question (特别是 this answer )以获得舍入日期时间的良好解决方案。这是我在自己的代码中使用的解决方案的副产品(注意 f 字符串的使用;如果您使用的是 Python < 3.6,则需要使用 str.format()):

import datetime as dt

def round_datetime(d, precision='second'):
"""Round a datetime to the named precision.

Cf. https://stackoverflow.com/a/3464000/7232335
"""
d += dt.timedelta(**{f"{precision}s": 1}) / 2
d -= dt.timedelta(minutes=d.minute,
seconds=d.second,
microseconds=d.microsecond)
return d # Return optional, since object d is modified in-place.
<小时/>

旁注:

有一些工作表方法可用于使用 OpenPyXL 迭代行:

1。 ws.iter_rows()

for row in ws.iter_rows(min_row=2, values_only=True):
date = row[0]

2。 ws.values

ws.iter_rows() 相同除了 values_only=True 之外没有任何参数.

values = ws.values
next(values) # Discard first row.
for row in values:
date = row[0]

3。 ws.rows

ws.iter_rows() 相同没有参数。

rows = ws.rows
next(rows) # Discard first row.
for row in ws.rows:
date = row[0].value

关于Python 从 Excel 日期/时间字段读取不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57530408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com