注意:
xw.__version__
Out[84]: '0.10.2'
pd.__version__
Out[85]: '0.16.2'
我有以下df:
>>> df.head()
data
1900-01-31 0.0315
1900-02-28 0.0314583333333
1900-03-31 0.0314166666667
1900-04-30 0.031375
1900-05-31 0.0313333333333
当我跑步时:
xw.sheets(str(sht)).range(k).value = d_of_dfs[k]
我在excel中看到以下内容:
data
1900-02-01 0.0315
1900-02-29 0.031458333
1900-03-31 0.031416667
1900-04-30 0.031375
1900-05-31 0.031333333
1900-06-30 0.031291667
1900-07-31 0.03125
1900-08-31 0.031208333
1900-09-30 0.031166667
1900-10-31 0.031125
是xlwings劫持早期日期并搞砸了吗?
此外 - xlwings根本无法处理1900年之前的日期。
答案 0 :(得分:2)
此问题源于excel存储日期的方式以及可以追溯到Lotus 123的错误。
来自http://www.cpearson.com/excel/datetime.htm
日期
数字的整数部分ddddd表示数字 自1900年1月1日以来的几天。例如,2000年1月19日的日期存储为 36,544,自1900年1月0日以来已过去36,544天。数字1 代表1900年1月1日。应该注意,数字0不是 代表1899年12月31日。它不是。如果您使用MONTH功能 日期为0,它将返回1月,而不是12月。而且, YEAR函数将返回1900,而不是1899.
实际上,这个数字比实际天数大一个。 这是因为Excel的行为就像1900年2月29日的日期一样。它 没有。 1900年不是闰年(2000年是一个飞跃 年)。在Excel中,1900年2月28日之后的那一天是1900年2月29日。在 事实上,1900年2月28日之后的那一天是1900年3月1日。这不是一个 "错误&#34 ;.确实,这是设计上的。 Excel以这种方式工作,因为它是 确实是Lotus 123中的一个错误。当Excel被引入时,123已经差不多了 电子表格软件的整个市场。微软决定 继续莲花' bug,为了完全兼容。切换的用户 从123到Excel不需要对他们的数据进行任何更改 只要您的所有日期晚于1900年3月1日,这应该是否定的 关注。
This answer有更多详细信息,但我刚刚将日期转换为excel似乎正确解析的字符串。
converted = str(datetime.date(1900, 1, 1))