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

CodeMeaningExample
%Y4-digit year2025
%y2-digit year25
%mMonth (01-12)06
%dDay (01-31)22
%HHour (00-23)14
%MMinute (00-59)30
%SSecond (00-59)45
%AFull weekdaySunday
%aAbbreviated weekdaySun
%BFull monthJune
%bAbbreviated monthJun

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)]