excel数字日期在python中的转换
原文代码为:
# 导入datetime模块
import datetime
# 将数值转换为日期
num = 17897
date = datetime.datetime.fromordinal(num + datetime.datetime(1900, 1, 1).toordinal() - 2)
# 输出日期
print(date.strftime("%Y-%m-%d"))
其中,原文有提到:
由于()函数将从0001年1月1日至今天的天数转换为日期,而Excel中将从1900年1月1日至今天的天数转换为数值,因此需要将num加上.(1900, 1, 1).() - 2。
但我疑惑为什么要-2?于是开始探索,最后终于发现:
因为我们要用已有的日期整数,加上1900/01/01这天代表的整数,而已有的日期整数其实已经包含了1900/01/01这一天,所以要减去1
例如,当什么都不减去时,数字1加上1900/01/01,得到的是1900/01/02
datetime.datetime.fromordinal(int(1) + datetime.datetime(1900, 1, 1).toordinal()).strftime("%Y/%m/%d")
'1900/01/02'
减去1之后就对应上了:
datetime.datetime.fromordinal(int(1) + datetime.datetime(1900, 1, 1).toordinal()-1).strftime("%Y/%m/%d")
'1900/01/01'
但是,为什么要减去2呢?我接着探索时发现,减去1并不能修正所有的日期,例如数字61在excel中是1900/03/01,但是在中转换后却是1900/03/02了:
datetime.datetime.fromordinal(int(61) + datetime.datetime(1900, 1, 1).toordinal()-1).strftime("%Y/%m/%d")
'1900/03/02'
后来多次尝试,是因为 excel 比 多了一天,这一天就是1900/02/29,而在中转化1900/02/29就会报错: day is out of range for month。查看日历,发现这一天在日历中并不存在,转换1900/0301(包含)之后的日期,excel就多了一天,就需要再减去一天才能转换为我们想要的准确日期。
tags:
电子表格