Cursus
Werken met datums en tijden lijkt simpel totdat je te maken krijgt met formats, tijdzones, zomer-/wintertijdregels of timestamps uit meerdere systemen. Op dat moment is het geen optie meer om tijd als ruwe strings of integers op te slaan. Python’s datetime-module helpt je al deze bewegende delen op een voorspelbare manier te beheren.
Deze gids loopt door de kernklassen heen, hoe je datetime-objecten maakt en gebruikt, hoe je rekenwerk uitvoert, waarden opmaakt en ontleedt, tijdzones afhandelt en meer. Elke sectie bouwt voort op de vorige, zodat je van basisbewerkingen naar meer gevorderde patronen kunt gaan.
Kernklassen van de Python datetime-module
Voor je iets specifieks doet, helpt het om te begrijpen hoe Python datums en tijden conceptueel modelleert. De datetime-module gebruikt een kleine set klassen, elk gericht op één deel van het probleem. Als je weet waar elke klas past, wordt de rest van de workflow veel eenvoudiger.
date
Als je alleen een kalenderdatum nodig hebt zonder je zorgen te maken over tijdstip of tijdzones, is de date-klasse wat je nodig hebt. Deze vertegenwoordigt het jaar, de maand en de dag via vertrouwde attributen.
Dit zijn de attributen:
-
year -
month -
day
En de methoden:
-
today() -
fromisoformat() -
replace() -
isoformat() -
weekday() -
isoweekday()
from datetime import date
d = date(2025, 3, 1)
print(d)
Deze code creëert een eenvoudige kalenderdatum. Als je een ongeldige combinatie invoert (zoals February 30), geeft Python een ValueError.
time
Sommige taken kijken alleen naar het tijdstip, bijvoorbeeld een herinnering die om 14:30 draait. De time-klasse is dan handig, omdat die uren, minuten, seconden en (niet nodig voor dit voorbeeld) microseconden of tijdzonegegevens opslaat.
De attributen zijn: hour, minute, second, microsecond, tzinfo
De methoden zijn: replace(), isoformat()
from datetime import time
t = time(14, 30, 15)
print(t)
Dit creëert een kloktijd zonder gekoppelde datum. Ongeldige waarden (zoals hour=27) genereren een fout.
datetime
De meeste situaties in de echte wereld combineren zowel datum als tijd, en daar komt datetime om de hoek. Het is de meest veelzijdige klasse in de module en degene die je het vaakst zult gebruiken voor logging, verwerking en het coördineren van events.
De attributen zijn (naast alle bovenstaande): tzinfo
En de methoden zijn now(), utcnow(), fromisoformat(), strptime(), strftime(), astimezone(). Het ondersteunt ook rekenwerk met timedelta, waar ik zo dieper op inga.
from datetime import datetime
dt = datetime(2025, 3, 1, 14, 30)
print(dt)
Dit levert een volledige timestamp op met zowel datum- als tijdcomponenten.
timedelta
Wanneer je verstreken tijd moet meten of een timestamp vooruit of achteruit moet verschuiven, is timedelta de juiste keuze. Het vertegenwoordigt een duur, geen specifiek moment.
De attributen zijn: days, seconds, microseconds. Het wordt vaak gebruikt voor offsets, tijdsverschillen en planningslogica.
from datetime import timedelta
delta = timedelta(days=7, hours=3)
print(delta)
Dit geeft een duur met vaste lengte weer. Het wordt vooral handig wanneer je het optelt bij of aftrekt van een datetime.
tzinfo
tzinfo definieert Python’s interface voor tijdzones. Je maakt deze niet direct zelf aan, maar het datetime-systeem gebruikt ze wanneer je tijdzones toevoegt of converteert.
timezone
timezone is een ingebouwde tzinfo-implementatie voor vaste UTC-offsets zoals UTC of UTC+1. Handig voor simpele gevallen waarbij zomer-/wintertijdregels niet van belang zijn.
Python datetime-objecten maken en benaderen
Als je de klassen kent, is de volgende stap leren hoe je er instanties van maakt. Python geeft je meerdere manieren, afhankelijk van waar je data vandaan komt: handmatige invoer, systeemtijd, timestamps of tekst.
Class-constructors gebruiken
Constructors geven je volledige controle over de waarden die je creëert. Dit is vaak de meest expliciete en foutbestendige manier om date-, time- of datetime-objecten op te bouwen.
from datetime import date
d = date(2025, 3, 1)
print(d)
Dit bouwt direct een kalenderdatum. Ongeldige waarden geven meteen een fout, waardoor je fouten vroeg opvangt.
from datetime import time
t = time(14, 30, 15)
print(t)
Dit levert een waarde voor tijdstip op. Gebruik dit wanneer je de datum niet nodig hebt.
from datetime import datetime
dt = datetime(2025, 3, 1, 14, 30)
print(dt)
Dit creëert een volledige timestamp. Een tzinfo-argument toevoegen maakt het tijdzone-bewust.
Maken vanuit timestamps
Unix-timestamps komen voor in logs, API’s en besturingssystemen. Python zet ze eenvoudig om naar voor mensen leesbare datetime-objecten.
datetime.fromtimestamp(1700000000)
datetime.utcfromtimestamp(1700000000)
De eerste interpreteert de timestamp in lokale tijd; de tweede interpreteert hem in UTC.
Classmethoden voor huidige waarden
Als je de huidige datum of tijd nodig hebt, biedt Python eenvoudige helpers. Die zijn essentieel voor logging, eventtracking en real-time pipelines.
from datetime import datetime, date, timezone
print(date.today())
print(datetime.now())
print(datetime.now(tz=timezone.utc)) # Python 3.12+ preferred
Deze geven je de huidige systeemtijd in lokale tijd of UTC, afhankelijk van wat je nodig hebt.
datetime.fromtimestamp(1700000000)
datetime.utcfromtimestamp(1700000000)
Deze zetten epoch-timestamps om in datetime-objecten. Ze komen extreem vaak voor bij het parseren van API- of databasewaarden.
Ontleden vanuit strings
Datasets in de praktijk slaan timestamps vaak als tekst op. Python biedt betrouwbare tools om die strings om te zetten naar gestructureerde waarden.
strptime()
from datetime import datetime
dt = datetime.strptime("2025-03-01 14:30", "%Y-%m-%d %H:%M")
print(dt)
strptime() ontleedt een string met een opmaakpatroon. Als de string niet exact overeenkomt, geeft Python ValueError.
from datetime import datetime
dt = datetime.strptime("not-a-date", "%Y-%m-%d")
Dit zal mislukken omdat de invoer niet overeenkomt met het verwachte patroon.
fromisoformat()
datetime.fromisoformat("2025-03-01T14:30:00")
ISO 8601-strings laten zich probleemloos ontleden omdat de structuur gestandaardiseerd is. Dit is vaak de makkelijkste manier om timestamps uit API’s of moderne datapipelines te laden.
Datumaritmetiek uitvoeren
Zodra je timestamps kunt maken, is de volgende stap ermee werken. Dat kan door duur te berekenen, datums te verschuiven of intervallen te vergelijken.
Timedelta voor temporele berekeningen
timedelta modelleert perioden met vaste duur zoals “5 uur” of “2 weken”. Deze perioden zijn handig voor planning, logging en als je een eenvoudige afteltimer nodig hebt.
from datetime import datetime, timedelta
dt = datetime(2025, 3, 1, 14, 30)
new_dt = dt + timedelta(days=5)
print(new_dt)
Dit voorbeeld verschuift de timestamp vijf dagen vooruit.
start = datetime(2025, 3, 1, 9, 0)
end = datetime(2025, 3, 1, 14, 30)
duration = end - start
print(duration.total_seconds())
Hier levert het aftrekken van twee datetimes een timedelta op, die je kunt omzetten naar seconden, dagen of uren.
Vaste duur versus kalenderbewuste rekenkunde
Niet alle tijdseenheden zijn gelijk. Maanden verschillen in lengte, jaren kunnen schrikkeldagen hebben en het einde-van-de-maandgedrag kan onvoorspelbaar zijn. Voor deze scenario’s is timedelta niet genoeg.
dateutil.relativedelta behandelt “kalenderbewuste” rekenkunde:
from dateutil.relativedelta import relativedelta
from datetime import date
d = date(2025, 1, 31)
print(d + relativedelta(months=1))
Dit gaat correct om met het ontbrekende “31 februari”-scenario door de datum passend te verschuiven.
Datums opmaken en ontleden
Datetime-opmaak kom je overal tegen: API’s verwachten specifieke formats, gebruikers willen leesbare tekst en logs zijn afhankelijk van consistente timestamp-strings. Python ondersteunt zowel flexibele opmaak als gestandaardiseerde weergaven.
Strings opmaken met strftime
strftime() laat je datetime-objecten omzetten naar opgemaakte strings met behulp van vooraf gedefinieerde codes.
from datetime import datetime
dt = datetime(2025, 3, 1, 14, 30)
print(dt.strftime("%A, %B %d, %Y at %H:%M"))
Dit print een voor mensen leesbare string met de weekdag en de volledige maandnaam.
dt.strftime("%Y-%m-%dT%H:%M:%S")
Dit produceert een ISO-achtige string die geschikt is voor dataopslag of API’s.
Strings ontleden met strptime
from datetime import datetime
dt = datetime.strptime("2025-03-01 14:30", "%Y-%m-%d %H:%M")
print(dt)
Dit zet tekst om in een datetime-object. Elke mismatch tussen de string en het patroon geeft een fout.
Werken met ISO 8601 en RFC 3339
ISO 8601 lost de ambiguïteit op die in veel regionale datumformaten voorkomt. Python ondersteunt dit standaard:
from datetime import datetime
dt = datetime.fromisoformat("2025-03-01T14:30:00")
print(dt.isoformat())
Dit is het veiligste format bij het uitwisselen van data tussen systemen, API’s of databases.
Tijdzones afhandelen
Tijdzones brengen enkele van de lastigste uitdagingen mee in temporeel programmeren. Python helpt door onderscheid te maken tussen naïeve en bewuste datetime-objecten en tools te bieden voor tijdzones in de echte wereld.
Naïeve vs. bewuste datetime-objecten
Een naïeve datetime heeft geen tijdzone:
from datetime import datetime
naive_dt = datetime(2025, 3, 1, 14, 30)
print(naive_dt.tzinfo) # None
Een bewuste datetime bevat een tijdzone-offset:
from datetime import timezone, timedelta
aware_dt = naive_dt.replace(tzinfo=timezone(timedelta(hours=1)))
print(aware_dt)
Het mixen van naïeve en bewuste waarden in vergelijkingen of rekenwerk veroorzaakt meestal fouten.
De module zoneinfo gebruiken
Python's zoneinfo-module biedt toegang tot echte IANA-tijdzones:
from zoneinfo import ZoneInfo
from datetime import datetime
dt = datetime(2025, 3, 1, 14, 30, tzinfo=ZoneInfo("Europe/Paris"))
print(dt)
Tijdzoneconversie is eenvoudig:
dt.astimezone(ZoneInfo("America/New_York"))
Dit drukt exact hetzelfde moment uit in een andere lokale tijdzone.
Converteren tussen tijdzones
Je kunt elke bewuste timestamp naar een andere zone converteren met astimezone():
from zoneinfo import ZoneInfo
dt_ny = dt.astimezone(ZoneInfo("America/New_York"))
print(dt_ny)
Een veelgebruikte best practice is om timestamps in UTC op te slaan en pas voor weergave te converteren.
Datums vergelijken en filteren
Vergelijkingen komen in bijna elke workflow voor. Denk aan het sorteren van logs, het filteren van events of bepalen of iets voor of na een drempel plaatsvond.
from datetime import datetime
a = datetime(2025, 3, 1, 12, 0)
b = datetime(2025, 3, 1, 15, 0)
print(a < b) # True
Tijdzonebewuste vergelijkingen houden rekening met offsets:
from datetime import datetime
from zoneinfo import ZoneInfo
dt1 = datetime(2025, 3, 1, 12, 0, tzinfo=ZoneInfo("Europe/London"))
dt2 = datetime(2025, 3, 1, 7, 0, tzinfo=ZoneInfo("America/New_York"))
print(dt1 == dt2) # True — same moment in time
Collecties filteren werkt natuurlijk:
dates = [
datetime(2025, 3, 1, 10),
datetime(2025, 2, 20, 9),
datetime(2025, 3, 1, 8)
]
cutoff = datetime(2025, 3, 1)
filtered = [d for d in dates if d >= cutoff]
print(filtered)
Normaliseren naar UTC is handig wanneer je met meerdere zones werkt.
Meer geavanceerde use-cases
Datetime duikt op in veel workflows buiten basis-ontleding en rekenwerk. Hier zijn een paar patronen die je vaak zult tegenkomen.
Unix-timestamps
Unix-timestamps meten seconden sinds 1 januari 1970 (UTC). Ze worden veel gebruikt in system programming en API’s.
from datetime import datetime
dt = datetime.fromtimestamp(1700000000)
print(dt)
Milliseconden en microseconden vereisen schalen:
ts_ms = 1700000000000
dt_ms = datetime.fromtimestamp(ts_ms / 1000)
ts_us = 1700000000000000
dt_us = datetime.fromtimestamp(ts_us / 1_000_000)
Plannen en timers
Bibliotheken zoals schedule zijn afhankelijk van datetime-waarden om te bepalen wanneer taken moeten draaien. Of je nu functies om de paar seconden triggert of een eenmalig event later op de dag plant, datetime vormt de basis voor die vergelijkingen.
Patronen voor data-analyse
Datetime-attributen worden vaak geëxtraheerd voor groepering en tijdgebaseerde analyse:
dt = datetime(2025, 3, 1, 14, 30)
print(dt.year)
print(dt.isocalendar())
In pandas is resamplen per periode extreem gebruikelijk:
import pandas as pd
df = pd.DataFrame({
"value": [10, 12, 15],
"timestamp": pd.to_datetime([
"2025-03-01",
"2025-03-02",
"2025-03-08"
])
}).set_index("timestamp")
print(df.resample("W").sum())
Conclusie
Wil je meer leren over datetime, bekijk dan deze video uit onze cursus Working with Dates and Times in Python door Max Shrom en Data Types for Data Science in Python door Jason Myers.
Misschien vind je onze tutorial Converting Strings to Dates as datetime Objects ook nuttig als je extra hulp nodig hebt bij het converteren van strings.
Techschrijver gespecialiseerd in AI, ML en data science, die complexe ideeën helder en toegankelijk maakt.

