xlwings - 早期日期(< = 1900' s)

时间:2017-04-28 14:46:37

标签: pandas xlwings

注意:

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年之前的日期。

1 个答案:

答案 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))