I just want to write down some notes about python and I will keep updating this post as I learn more about python.
Python DateTime Guide
Main Types
1. date — Calendar Date Only
from datetime import date
d = date(2025, 6, 22) # year, month, day
d.year # 2025
d.month # 6
d.day # 22
d.weekday() # 0=Monday, 6=Sunday
d.isoformat() # "2025-06-22"
2. time — Time of Day Only
from datetime import time
t = time(14, 30, 45) # hour, minute, second
t = time(14, 30, 45, 123456) # with microseconds
t.hour # 14
t.minute # 30
t.second # 45
t.microsecond # 123456
t.isoformat() # "14:30:45.123456"
3. datetime — Date + Time Combined (Most Common)
from datetime import datetime
dt = datetime(2025, 6, 22, 14, 30, 45)
dt = datetime.now() # current date and time
dt.date() # extract just the date
dt.time() # extract just the time
dt.isoformat() # "2025-06-22T14:30:45"
4. timedelta — Duration/Difference
from datetime import timedelta
delta = timedelta(days=5, hours=3, minutes=30, seconds=10)
delta = timedelta(weeks=2)
delta.total_seconds() # convert to total seconds
delta.days # 14 (from weeks=2)
# Arithmetic
delta1 = timedelta(days=5)
delta2 = timedelta(days=3)
delta1 + delta2 # timedelta(days=8)
delta1 - delta2 # timedelta(days=2)
5. timezone — Timezone Information
from datetime import timezone, timedelta
utc = timezone.utc # UTC timezone
est = timezone(timedelta(hours=-5)) # EST (UTC-5)
custom = timezone(timedelta(hours=5, minutes=30)) # UTC+5:30
Creating DateTimes
From Scratch
from datetime import datetime
dt = datetime(2025, 6, 22, 14, 30, 45)
dt = datetime(2025, 6, 22) # time defaults to 00:00:00
Current Time
from datetime import datetime, timezone
dt = datetime.now() # local timezone
dt = datetime.utcnow() # UTC (deprecated in Python 3.12+)
dt = datetime.now(timezone.utc) # UTC (preferred)
From String (Parsing)
from datetime import datetime
# ISO format (recommended)
dt = datetime.fromisoformat("2025-06-22T14:30:45")
dt = datetime.fromisoformat("2025-06-22")
# Custom format
dt = datetime.strptime("2025-06-22", "%Y-%m-%d")
dt = datetime.strptime("06/22/2025", "%m/%d/%Y")
From Timestamp
from datetime import datetime
dt = datetime.fromtimestamp(1719075045) # local timezone
dt = datetime.utcfromtimestamp(1719075045) # UTC
With Timezone
from datetime import datetime, timezone
dt = datetime.now(timezone.utc)
dt = datetime(2025, 6, 22, 14, 30, 45, tzinfo=timezone.utc)
Comparisons
from datetime import datetime
dt1 = datetime(2025, 6, 22)
dt2 = datetime(2025, 6, 25)
dt1 < dt2 # True
dt1 <= dt2 # True
dt1 > dt2 # False
dt1 >= dt2 # False
dt1 == dt2 # False
dt1 != dt2 # True
String Formatting and Parsing
Format to String
from datetime import datetime
dt = datetime(2025, 6, 22, 14, 30, 45)
dt.strftime("%Y-%m-%d") # "2025-06-22"
dt.strftime("%Y-%m-%d %H:%M:%S") # "2025-06-22 14:30:45"
dt.strftime("%m/%d/%Y") # "06/22/2025"
dt.strftime("%A, %B %d, %Y") # "Sunday, June 22, 2025"
dt.isoformat() # "2025-06-22T14:30:45"
Parse from String
from datetime import datetime
datetime.strptime("2025-06-22", "%Y-%m-%d")
datetime.strptime("06/22/2025", "%m/%d/%Y")
datetime.fromisoformat("2025-06-22T14:30:45")
Common Format Codes
| Code | Meaning | Example |
|---|---|---|
%Y | 4-digit year | 2025 |
%y | 2-digit year | 25 |
%m | Month (01-12) | 06 |
%d | Day (01-31) | 22 |
%H | Hour (00-23) | 14 |
%M | Minute (00-59) | 30 |
%S | Second (00-59) | 45 |
%A | Full weekday | Sunday |
%a | Abbreviated weekday | Sun |
%B | Full month | June |
%b | Abbreviated month | Jun |
Common Operations
Add/Subtract Durations
from datetime import datetime, timedelta
dt = datetime(2025, 6, 22, 14, 30, 45)
dt + timedelta(days=5) # 2025-06-27
dt - timedelta(hours=3) # 2025-06-22 11:30:45
dt + timedelta(weeks=2, hours=3) # Add 2 weeks and 3 hours
Calculate Difference
from datetime import datetime
dt1 = datetime(2025, 6, 22)
dt2 = datetime(2025, 6, 25)
delta = dt2 - dt1 # timedelta(days=3)
delta.days # 3
delta.total_seconds() # 259200.0
Replace Components
from datetime import datetime
dt = datetime(2025, 6, 22, 14, 30, 45)
dt.replace(year=2026) # 2026-06-22 14:30:45
dt.replace(month=1, day=1) # 2025-01-01 14:30:45
dt.replace(hour=0, minute=0, second=0) # 2025-06-22 00:00:00
Timezone Handling
Aware vs Naive Datetimes
from datetime import datetime, timezone
# Naive (no timezone info)
dt_naive = datetime(2025, 6, 22, 14, 30)
dt_naive.tzinfo # None
# Aware (has timezone info)
dt_aware = datetime(2025, 6, 22, 14, 30, tzinfo=timezone.utc)
dt_aware.tzinfo # timezone.utc
Add Timezone to Naive DateTime
from datetime import datetime, timezone
dt_naive = datetime(2025, 6, 22, 14, 30)
dt_aware = dt_naive.replace(tzinfo=timezone.utc)
Convert Between Timezones
from datetime import datetime, timezone, timedelta
# Create UTC datetime
utc_dt = datetime.now(timezone.utc)
# Convert to EST (UTC-5)
est = timezone(timedelta(hours=-5))
est_dt = utc_dt.astimezone(est)
Pandas Integration
Working with pd.Timestamp
import pandas as pd
from datetime import datetime
# Create from datetime
dt = datetime(2025, 6, 22)
ts = pd.Timestamp(dt)
# Create directly
ts = pd.Timestamp("2025-06-22")
ts = pd.Timestamp(2025, 6, 22)
# Comparisons (work with datetime objects)
dt = datetime(2025, 6, 22)
ts = pd.Timestamp("2025-06-22")
ts >= dt # Works directly
Filter DataFrame by Date Range
import pandas as pd
from datetime import datetime
df = pd.DataFrame({
'date': pd.date_range('2025-01-01', periods=100),
'value': range(100)
})
start = datetime(2025, 3, 1)
end = datetime(2025, 3, 31)
filtered = df[(df['date'] >= start) & (df['date'] <= end)]