如何将python datetime.datetime转换为excel序列号

Hom*_*lli 16 python excel datetime data-munging

我需要将日期转换为Excel序列号,以用于我正在编写的数据修改脚本.通过在我的OpenOffice Calc工作簿中播放日期,我能够推断出'1-Jan 1899 00:00:00'映射到数字零.

我编写了以下函数来将python datetime对象转换为Excel序列号:

def excel_date(date1):
    temp=dt.datetime.strptime('18990101', '%Y%m%d')
    delta=date1-temp
    total_seconds = delta.days * 86400 + delta.seconds
    return total_seconds
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试一些示例日期时,数字与我在Excel中格式化日期时所获得的数字不同(以及OpenOffice Calc).例如,测试'2009-03-20'在Python中给出3478032000,而excel将序列号呈现为39892.

上面的公式出了什么问题?

*注意:我使用的是Python 2.6.3,因此无法访问datetime.total_seconds()

akg*_*ood 35

看来,Excel的"序列号"格式实际上是数以来1900-01-00,随着小数部分,这是一个一天的一小部分,基于http://www.cpearson.com/excel/datetime.嗯.(我想这个日期实际上应该被认为是1899-12-31,因为没有一个月的第0天这样的事情)

所以,它似乎应该是:

def excel_date(date1):
    temp = dt.datetime(1899, 12, 30)    # Note, not 31st Dec but 30th!
    delta = date1 - temp
    return float(delta.days) + (float(delta.seconds) / 86400)
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了你的功能,但我必须改变`temp = dt.datetime(1899,12,30)`以获得正确的结果. (12认同)
  • 请参阅http://www.joelonsoftware.com/items/2006/06/16.html.基本上,这是因为Excel希望在日期与Lotus 1-2-3兼容. (3认同)
  • 在Excel中的数字为60的单元格,按Ctrl + Shift + 3将转换为1900/02/29,这在任何日历中都不存在.这是奇怪的一天来自哪里. (3认同)

Jaz*_*hit 12

虽然这与excel序列日期格式不完全相关,但这是将Python日期时间导出到Excel的最高点.我发现特别有用和简单的是使用strftime导出.

import datetime
current_datetime = datetime.datetime.now()
current_datetime.strftime('%x %X')
Run Code Online (Sandbox Code Playgroud)

这将以下列格式输出'06/25/14 09:59:29',Excel将其作为有效日期/时间接受,并允许在Excel中进行排序.


rjh*_*a94 7

如果问题是我们想要 DATEVALUE() excel 日期序列号,则可以使用 toordinal() 函数。Python 序列号从第 1 年的 Jan1 开始,而 excel 从 1900 年 1 月 1 日开始,因此应用偏移量。另请参阅 excel 1900 闰年错误 ( https://support.microsoft.com/en-us/help/214326/excel-incorrectly-assumes-that-the-year-1900-is-a-leap-year )

def convert_date_to_excel_ordinal(day, month, year) :

    offset = 693594
    current = date(year,month,day)
    n = current.toordinal()
    return (n - offset)
Run Code Online (Sandbox Code Playgroud)