【问题标题】:xlwings - early dates (<=1900's)xlwings - 早期(<=1900 年代)
【发布时间】:2017-04-28 14:46:36
【问题描述】:

注意:

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

【问题讨论】:

    标签: pandas xlwings


    【解决方案1】:

    这个问题源于 excel 存储日期的方式和一个可以追溯到 Lotus 123 的错误。

    来自http://www.cpearson.com/excel/datetime.htm

    日期

    数字的整数部分 ddddd 表示 自 1900 年 1 月 0 日以来的天数。例如,日期 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-Feb-29 存在。它 没有。 1900 年不是闰年(2000 年是闰年) 年)。在 Excel 中,1900-Feb-28 之后的一天是 1900-Feb-29。在 实际上,1900-Feb-28 之后的第二天是 1900-Mar-1 。这不是一个 “漏洞”。确实,这是设计使然。 Excel 以这种方式工作,因为它是 确实是 Lotus 123 中的一个错误。在引入 Excel 时,123 几乎 电子表格软件的整个市场。微软决定 继续 Lotus 的 bug,以实现完全兼容。切换的用户 从 123 到 Excel 不必对其数据进行任何更改。
    只要您的所有日期都晚于 1900 年 3 月 1 日,这应该是没有的 担心。

    This answer 有更多细节,尽管我刚刚将日期转换为 Excel 似乎可以正确解析的字符串。

    converted = str(datetime.date(1900, 1, 1))
    

    【讨论】:

    • 鉴于 xlwings 与 pandas 的集成,我认为这将得到处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2011-04-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    相关资源
    最近更新 更多