【问题标题】:How to convert a python datetime.datetime to excel serial date number如何将 python datetime.datetime 转换为 excel 序列号
【发布时间】:2012-03-23 09:44:12
【问题描述】:

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

我写了下面的函数来将python日期时间对象转换成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)中将日期格式化为数字时得到的数字不同。例如,在 Python 中测试 '2009-03-20' 得到 3478032000,而 excel 将序列号呈现为 39892。

上面的公式有什么问题?

*注意:我使用的是 Python 2.6.3,所以无权访问 datetime.total_seconds()

【问题讨论】:

    标签: python excel datetime data-munging


    【解决方案1】:

    看来,Excel“序列日期”格式实际上是自 1900 年 1 月 00 日以来的天数,其中的小数部分是一天的一小部分,基于http://www.cpearson.com/excel/datetime.htm。 (我想这个日期实际上应该被认为是 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 链接。似乎 Excel 正在使用 1900-01-00 的奇怪日期,因为上述函数计算的日期是一天(根据 Excel)。
    • joelonsoftware.com/items/2006/06/16.html。基本上,这是因为 Excel 希望在日期上与 Lotus 1-2-3 兼容。
    • 我试过你的功能,但我必须更改temp = dt.datetime(1899, 12, 30)才能得到正确的结果。
    • 将“temp = dt.datetime(1899, 12, 30)”更改为“temp = datetime.datetime(1899, 12, 31)”
    • excel中数字60的单元格,按Ctrl+Shift+3会转换为1900/02/29,在任何日历中都不存在。这就是奇怪的一天的来源。
    【解决方案2】:

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

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

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

    【讨论】:

    • 如果你愿意去 Excel 并有额外的步骤在那边转换成串行,我觉得这很完美,而且更优雅
    • 这是最好的答案,请放心。简单的。蟒蛇式。并且容易记住 (%e-x-cel)! :)
    • 正如 JazyWhit 所说,当人们想要将日期时间转换为 excel 日期数字时,请注意这将不起作用。这是题外话,不是这个问题的最佳答案。
    【解决方案3】:

    如果问题是我们想要 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)
    

    【讨论】:

      【解决方案4】:

      使用第 3 方 xlrd.xldate 模块,您可以提供结构为 (year, month, day, hour, minute, second) 的元组,并在必要时从任何微秒组件计算一天的分数:

      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
      

      【讨论】:

        【解决方案5】:

        根据@akgood的answer,当datetime在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
        

        【讨论】:

          【解决方案6】:

          当我使用 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()))
          ...
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-06-15
            • 1970-01-01
            • 2013-10-10
            • 1970-01-01
            • 2011-12-22
            • 2010-10-18
            • 2015-03-09
            • 2012-07-22
            相关资源
            最近更新 更多