Как преобразовать Python datetime.datetime в номер серийной даты Excel - PullRequest
16 голосов
/ 06 марта 2012

Мне нужно преобразовать даты в серийные номера 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).Например, тестирование «2009-03-20» дает 3478032000 в Python, в то время как Excel отображает серийный номер как 39892.

Что не так с формулой выше?

* Примечание: яиспользуя Python 2.6.3, поэтому не имеете доступа к datetime.total_seconds ()

Ответы [ 4 ]

35 голосов
/ 06 марта 2012

Похоже, что формат "серийной даты" в Excel на самом деле представляет собой число дней с 1900-01-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)
11 голосов
/ 25 июня 2014

Хотя это не совсем относится к формату последовательной даты Excel, это был главный хит для экспорта даты и времени Python в Excel.Что мне показалось особенно полезным и простым, так это просто экспортировать с использованием strftime.

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

Это выведет в следующем формате «06/25/14 09:59:29», который принимается Excel какдопустимая дата / время и позволяет сортировать в Excel.

0 голосов
/ 28 января 2019

С помощью стороннего модуля 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
0 голосов
/ 24 ноября 2017

если проблема в том, что нам нужен DATEVALUE () excel серийный номер для дат, можно использовать функцию toordinal (). Серийные номера Python начинаются с 1 января 1 года, тогда как Excel начинается с 1 января 1900 года, поэтому примените смещение. Также см. Ошибку 1900 високосного года в Excel (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)
...