Last active
September 18, 2018 19:52
-
-
Save imjp94/32d44ae6fd9696a16ecccb0aa54af9bf to your computer and use it in GitHub Desktop.
Convert datetime from/to excel serial date
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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