Skip to content

Instantly share code, notes, and snippets.

@imjp94
Last active September 18, 2018 19:52
Show Gist options
  • Save imjp94/32d44ae6fd9696a16ecccb0aa54af9bf to your computer and use it in GitHub Desktop.
Save imjp94/32d44ae6fd9696a16ecccb0aa54af9bf to your computer and use it in GitHub Desktop.
Convert datetime from/to excel serial date
from datetime import datetime, time
def serial_to_datetime(serial):
""" Convert excel serial date to :class:`datetime` """
# 30/12/1899 used instead of 01/01/1900 in order to offset 2 days due to, serial counting & excel leap year bug
dt = datetime.fromordinal(datetime(1899, 12, 30).toordinal() + int(serial))
t = serial_to_time(serial)
return dt.replace(hour=t.hour, minute=t.minute, second=t.second)
def datetime_to_serial(dt):
""" Convert :class:`datetime` to excel serial date """
# 30/12/1899 used instead of 01/01/1900 in order to offset 2 days due to, serial counting & excel leap year bug
delta = dt - datetime(1899, 12, 30)
return float(delta.days) + (float(delta.seconds) / 86400)
def serial_to_time(serial):
""" Convert excel serial time to :class:`time` """
h, r = divmod(serial % 1 * 24, 1)
m, r = divmod(r * 60, 1)
return time(hour=int(h), minute=int(m), second=int(r * 60))
def time_to_serial(t):
""" Convert :class:`time` to excel serial time """
return (t.hour / 24) + (t.minute / 1440) + (t.second / 86400)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment