【发布时间】:2015-09-30 06:54:33
【问题描述】:
我正在从 excel 中读取数据并使用 python 操作数据。但是日期以整数形式出现。如何将日期转换回日期格式?
5/15/2015 即将以 42139.00 形式发布
【问题讨论】:
-
对于
pandas特定的解决方案,另请参阅Convert Excel style date with pandas。
标签: python excel datetime xlrd
我正在从 excel 中读取数据并使用 python 操作数据。但是日期以整数形式出现。如何将日期转换回日期格式?
5/15/2015 即将以 42139.00 形式发布
【问题讨论】:
pandas 特定的解决方案,另请参阅Convert Excel style date with pandas。
标签: python excel datetime xlrd
模块xlrd提供函数xldate_as_tuple将Excel的数字日期格式转换为元组(year, month, day, hour, minute, nearest_second)。
然后您可以使用datetime.datetime 将元组转换为datetime 对象。
from datetime import datetime
import xlrd
excel_date = 44032
python_date = datetime(*xlrd.xldate_as_tuple(excel_date, 0))
【讨论】:
xlrd.xldate_as_tuple() 的第二个参数是工作簿的“日期模式”(即基于 1900 或 1904 的日期)。最好从您的工作簿直接传递。 (即工作簿的 datemode 属性)。 xlrd.readthedocs.io/en/latest/…
from datetime import datetime
excel_date = 42139
dt = datetime.fromordinal(datetime(1900, 1, 1).toordinal() + excel_date - 2)
tt = dt.timetuple()
print(dt)
print(tt)
正如 J.F. Sebastian 所述,此答案仅适用于 1900/03/01 之后的任何日期
编辑:(回复@R.K)
如果您的 excel_date 是浮点数,请使用以下代码:
from datetime import datetime
def floatHourToTime(fh):
hours, hourSeconds = divmod(fh, 1)
minutes, seconds = divmod(hourSeconds * 60, 1)
return (
int(hours),
int(minutes),
int(seconds * 60),
)
excel_date = 42139.23213
dt = datetime.fromordinal(datetime(1900, 1, 1).toordinal() + int(excel_date) - 2)
hour, minute, second = floatHourToTime(excel_date % 1)
dt = dt.replace(hour=hour, minute=minute, second=second)
print(dt)
assert str(dt) == "2015-05-15 00:13:55"
【讨论】:
-2 并不总是正确的,请参阅this answer
-2 因为 Excel 日期的“开始日期”实际上是 1899 年的最后一天,而 Excel 假定 1900 年是闰年(事实并非如此)。 xlrd.readthedocs.io/en/latest/…