🧬 DataType¶
In [29]:
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
In [30]:
from datetime import datetime
date_in_string = "06/11/2016"
datetime.strptime(date_in_string, "%m/%d/%Y") # string previously time
now = datetime.now()
now # class is datetime.datetime
today = datetime.today() # same as now()
today # class is datetime.datetime
current_time_string = datetime.strftime(now, "%m/%d/%Y") # string from time
current_time_string # class is string
now
str(now) # works too
# components
# d, m, y, h, m, s(decimal allowed)
# standard formats
now.isoformat() # ISO format - widely used
Out[30]:
datetime.datetime(2016, 6, 11, 0, 0)
Out[30]:
datetime.datetime(2025, 5, 6, 22, 49, 13, 175495)
Out[30]:
datetime.datetime(2025, 5, 6, 22, 49, 13, 177205)
Out[30]:
'05/06/2025'
Out[30]:
datetime.datetime(2025, 5, 6, 22, 49, 13, 175495)
Out[30]:
'2025-05-06 22:49:13.175495'
Out[30]:
'2025-05-06T22:49:13.175495'
🕵️♂️ Extractions¶
In [31]:
now.year
now.month
now.day
now.hour
now.minute
now.second
now.weekday() # 0 for monday
import calendar
calendar.day_name[0] # Monday
calendar.day_name[now.weekday()] # Monday
Out[31]:
2025
Out[31]:
5
Out[31]:
6
Out[31]:
22
Out[31]:
49
Out[31]:
13
Out[31]:
1
Out[31]:
'Monday'
Out[31]:
'Tuesday'
✍️ Modifications¶
In [32]:
# replace a component of datetime object
# now.day = 1 # fails
now.replace(day=1) # returns a value and not modify inplace
Out[32]:
datetime.datetime(2025, 5, 1, 22, 49, 13, 175495)
🪄 Formatting¶
In [41]:
# 2 digit convert to 4 digit year
# Cutoff: 1969 Jan 01
datetime.strptime("2020 12 31", "%Y %m %d") # 2020
datetime.strptime("91 12 31", "%y %m %d") # 1991
[datetime.strptime(f"{str(x).zfill(2)} 12 31", "%y %m %d") for x in range(0,10,1)]
[datetime.strptime(f"{str(x).zfill(2)} 01 01", "%y %m %d") for x in range(0,10,1)]
Out[41]:
datetime.datetime(2020, 12, 31, 0, 0)
Out[41]:
datetime.datetime(1991, 12, 31, 0, 0)
Out[41]:
[datetime.datetime(2000, 12, 31, 0, 0), datetime.datetime(2001, 12, 31, 0, 0), datetime.datetime(2002, 12, 31, 0, 0), datetime.datetime(2003, 12, 31, 0, 0), datetime.datetime(2004, 12, 31, 0, 0), datetime.datetime(2005, 12, 31, 0, 0), datetime.datetime(2006, 12, 31, 0, 0), datetime.datetime(2007, 12, 31, 0, 0), datetime.datetime(2008, 12, 31, 0, 0), datetime.datetime(2009, 12, 31, 0, 0)]
Out[41]:
[datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(2002, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0), datetime.datetime(2004, 1, 1, 0, 0), datetime.datetime(2005, 1, 1, 0, 0), datetime.datetime(2006, 1, 1, 0, 0), datetime.datetime(2007, 1, 1, 0, 0), datetime.datetime(2008, 1, 1, 0, 0), datetime.datetime(2009, 1, 1, 0, 0)]
🧰 Manipulations¶
In [34]:
from datetime import timedelta
time_additions = timedelta(days=20)
time_additions # class: datetime.timedelta
# days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0
Out[34]:
datetime.timedelta(days=20)
In [35]:
now + timedelta(days=1, weeks=1) # add 1 days plus 1 weeks
now + timedelta(days=8, weeks=1) # add 8 days plus 1 weeks
now - timedelta(days=20)
now + timedelta(days=20)
Out[35]:
datetime.datetime(2025, 5, 14, 22, 49, 13, 175495)
Out[35]:
datetime.datetime(2025, 5, 21, 22, 49, 13, 175495)
Out[35]:
datetime.datetime(2025, 4, 16, 22, 49, 13, 175495)
Out[35]:
datetime.datetime(2025, 5, 26, 22, 49, 13, 175495)
In [36]:
time_1 = now
time_2 = now + timedelta(minutes=60)
In [37]:
time_2 - time_1 # 3600 seconds. Class:datetime.timedelta
(time_2 - time_1).seconds # 3600
(time_2 - time_1).total_seconds() # 3600.0
(time_2 - time_1).total_seconds() /60 # total minutes = 60.0
(time_2 - time_1)/timedelta(minutes=1) # total minutes = 60.0
(time_2 - time_1).days # 0
(time_2 - time_1).microseconds # 0
if False:
(time_2 - time_1).milliseconds # not applicable
(time_2 - time_1).minutes # not applicable
(time_2 - time_1).hours # not applicable
(time_2 - time_1).weeks # not applicable
Out[37]:
datetime.timedelta(seconds=3600)
Out[37]:
3600
Out[37]:
3600.0
Out[37]:
60.0
Out[37]:
60.0
Out[37]:
0
Out[37]:
0
In [38]:
time_1 - time_2
(time_1 - time_2).seconds # 82800
(time_1 - time_2).days # -1
(time_1 - time_2).microseconds # 0
if False:
(time_1 - time_2).milliseconds # not applicable
(time_1 - time_2).minutes # not applicable
(time_1 - time_2).hours # not applicable
(time_1 - time_2).weeks # not applicable
(time_1 - time_2).total_seconds() # -3600.0
Out[38]:
datetime.timedelta(days=-1, seconds=82800)
Out[38]:
82800
Out[38]:
-1
Out[38]:
0
In [39]:
# date range generate
from datetime import timedelta
[now + timedelta(days = x+1) for x in range(3)]
# now + [timedelta(days = x+1) for x in range(3)] # vectorization not allowed
my_date_ranges = [now + timedelta(days = x+1) for x in range(10)]
min(my_date_ranges)
max(my_date_ranges)
Out[39]:
[datetime.datetime(2025, 5, 7, 22, 49, 13, 175495), datetime.datetime(2025, 5, 8, 22, 49, 13, 175495), datetime.datetime(2025, 5, 9, 22, 49, 13, 175495)]
Out[39]:
datetime.datetime(2025, 5, 7, 22, 49, 13, 175495)
Out[39]:
datetime.datetime(2025, 5, 16, 22, 49, 13, 175495)
📦 Containers¶
In [40]:
my_dates = ["2020 11 21", "2020 11 20", "2020 11 22"]
# datetime.strptime(my_dates, "%m/%d/%Y") # list not allowed, string expected
my_dates = [datetime.strptime(x, "%Y %m %d") for x in my_dates]
my_dates
sorted(my_dates) # sorting allowed
Out[40]:
[datetime.datetime(2020, 11, 21, 0, 0), datetime.datetime(2020, 11, 20, 0, 0), datetime.datetime(2020, 11, 22, 0, 0)]
Out[40]:
[datetime.datetime(2020, 11, 20, 0, 0), datetime.datetime(2020, 11, 21, 0, 0), datetime.datetime(2020, 11, 22, 0, 0)]