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

时间:2012-03-05 22:08:58

标签: 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

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

上述公式有什么问题?

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

6 个答案:

答案 0 :(得分:33)

Excel“序列日期”格式实际上是自1900-01-00以来的数量,基于{{3}的小数部分是一天的一小部分}。 (我想这个日期应该被认为是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)

答案 1 :(得分:10)

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

import datetime
current_datetime = datetime.datetime.now()
current_datetime.strftime('%x %X')

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

答案 2 :(得分:0)

如果问题是我们想要日期的DATEVALUE()excel序列号,可以使用toordinal()函数。 Python序列号从1年1月1日开始,而excel从1900年1月1日开始,因此应用偏移量。另见excel 1900闰年bug(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)

答案 3 :(得分:0)

使用第三方xlrd.xldate模块,您可以提供一个结构为from datetime import datetime from xlrd import xldate from operator import attrgetter def excel_date(input_date): components = ('year', 'month', 'day', 'hour', 'minute', 'second') frac = input_date.microsecond / (86400 * 10**6) # divide by microseconds in one day return xldate.xldate_from_datetime_tuple(attrgetter(*components)(input_date), 0) + frac res = excel_date(datetime(1900, 3, 1, 12, 0, 0, 5*10**5)) # 61.50000578703704 的元组,并在必要时根据任何微秒的组成部分来计算日分数:

COl_NAME + " TEXT, " +

答案 4 :(得分:0)

根据@akgood的answer,当日期时间在1/0/1900之前时,返回值错误,更正后的返回表达式可能是:

def excel_date(date1):
    temp = dt.datetime(1899, 12, 30)    # Note, not 31st Dec but 30th!
    delta = date1 - temp
    return float(delta.days) + (-1.0 if delta.days < 0 else 1.0)*(delta.seconds)) / 86400

答案 5 :(得分:0)

当我使用csv package创建电子表格进行测试时,此方法有效:

from datetime import datetime

def excel_date(date1):
    return date1.strftime('%x %-I:%M:%S %p')

now = datetime.now()
current_datetime=now.strftime('%x %-I:%M:%S %p')
time_data.append(excel_date(datetime.now()))
...