Kurs
Tarihler ve saatlerle çalışmak, formatlar, saat dilimleri, yaz saati uygulaması kuralları veya birden çok sistemden gelen zaman damgalarıyla uğraşmaya başlayana kadar basit görünür; bu noktada zamanı ham dizeler veya tamsayılar olarak saklamak bir seçenek olmaktan çıkar. Python’un datetime modülü, tüm bu hareketli parçaları öngörülebilir bir şekilde yönetmenize yardımcı olmak için vardır.
Bu rehber, çekirdek sınıfları, datetime nesnelerinin nasıl oluşturulup kullanılacağını, aritmetik işlemlerin nasıl yapılacağını, değerlerin nasıl biçimlendirileceğini ve ayrıştırılacağını, saat dilimlerinin nasıl ele alınacağını ve daha fazlasını adım adım açıklar. Her bölüm bir öncekine dayanır; böylece temel işlemlerden daha gelişmiş kalıplara ilerleyebilirsiniz.
Python datetime Modülünün Çekirdek Sınıfları
Özele inmeden önce, Python’un tarih ve saati kavramsal düzeyde nasıl modellediğini anlamak faydalıdır. datetime modülü, her biri sorunun bir parçasına odaklanan küçük bir sınıf kümesi kullanır. Her sınıfın nereye oturduğunu bilmek, geri kalan iş akışını çok daha kolay hale getirir.
date
Günün saati veya saat dilimleriyle uğraşmadan yalnızca bir takvim tarihi gerektiğinde, ihtiyacınız olan sınıf date sınıfıdır. Yılı, ayı ve günü tanıdık özniteliklerle temsil eder.
İşte öznitelikler:
-
year -
month -
day
Ve yöntemler:
-
today() -
fromisoformat() -
replace() -
isoformat() -
weekday() -
isoweekday()
from datetime import date
d = date(2025, 3, 1)
print(d)
Bu kod basit bir takvim tarihi oluşturur. Geçersiz bir kombinasyon girerseniz (örneğin February 30), Python bir ValueError hatası yükseltir.
time
Bazı görevler yalnızca günün saatini önemser; örneğin 14:30’da çalışan bir hatırlatıcı. time sınıfı burada yardımcı olur çünkü saat, dakika, saniye ve (bu örnek için gerekli olmasa da) mikrosaniye veya saat dilimi verisini saklar.
Öznitelikler: hour, minute, second, microsecond, tzinfo
Yöntemler: replace(), isoformat()
from datetime import time
t = time(14, 30, 15)
print(t)
Bu, tarihle ilişkilendirilmemiş bir saat oluşturur. Geçersiz değerler (ör. hour=27) hata üretir.
datetime
Gerçek dünya durumlarının çoğu hem tarihi hem de saati birleştirir ve datetime burada devreye girer. Modüldeki en esnek sınıftır ve günlük kayıt, işleme ve olayların koordinasyonu için en sık kullanacağınız sınıftır.
Öznitelikler (yukarıdakilere ek olarak): tzinfo
Ve yöntemler now(), utcnow(), fromisoformat(), strptime(), strftime(), astimezone() Ayrıca timedelta ile aritmetiği de destekler; bunu daha ayrıntılı ele alacağım.
from datetime import datetime
dt = datetime(2025, 3, 1, 14, 30)
print(dt)
Bu, hem tarih hem saat bileşenlerine sahip eksiksiz bir zaman damgası üretir.
timedelta
Geçen süreyi ölçmeniz veya bir zaman damgasını ileri ya da geri kaydırmanız gerektiğinde, timedelta doğru seçimdir. Belirli bir anı değil, bir süreyi temsil eder.
Öznitelikler: days, seconds, microseconds. Genellikle ofsetler, zaman farkları ve zamanlama mantığı için kullanılır.
from datetime import timedelta
delta = timedelta(days=7, hours=3)
print(delta)
Bu, sabit uzunlukta bir süreyi temsil eder. Özellikle bir datetime ile toplanıp çıkarıldığında kullanışlı hale gelir.
tzinfo
tzinfo, Python’un saat dilimleri için arayüzünü tanımlar. Bunları doğrudan oluşturmazsınız, ancak saat dilimleri eklediğinizde veya dönüştürdüğünüzde datetime sistemi bunları kullanır.
timezone
timezone, UTC veya UTC+1 gibi sabit UTC ofsetleri için yerleşik bir tzinfo uygulamasıdır. Yaz saati kurallarının önemli olmadığı basit durumlarda kullanışlıdır.
Python datetime Nesneleri Oluşturma ve Erişme
Sınıfları öğrendikten sonra sıradaki adım, bunların örneklerini oluşturmayı öğrenmektir. Python, verilerinizin geldiği yere bağlı olarak birkaç yaklaşım sunar: elle giriş, sistem zamanı, zaman damgaları veya metin.
Sınıf kurucularını kullanma
Kurucular, oluşturduğunuz değerlere tam kontrol sağlar. Bu, tarih, saat veya datetime nesneleri oluşturmanın çoğunlukla en açık ve hataya en dayanıklı yoludur.
from datetime import date
d = date(2025, 3, 1)
print(d)
Bu, bir takvim tarihini doğrudan oluşturur. Geçersiz değerler anında hata fırlatarak hataları erken yakalamaya yardımcı olur.
from datetime import time
t = time(14, 30, 15)
print(t)
Bu, günün saati değerini üretir. Tarihe ihtiyaç duymadığınızda bunu kullanın.
from datetime import datetime
dt = datetime(2025, 3, 1, 14, 30)
print(dt)
Bu, tam bir zaman damgası oluşturur. Bir tzinfo bağımsız değişkeni eklemek, onu saat dilimi farkında hale getirir.
Zaman damgalarından oluşturma
Unix zaman damgaları günlüklerde, API’lerde ve işletim sistemlerinde karşınıza çıkar. Python, bunları kolayca insan tarafından okunabilir datetime nesnelerine dönüştürür.
datetime.fromtimestamp(1700000000)
datetime.utcfromtimestamp(1700000000)
İlki zaman damgasını yerel zamanda yorumlar; ikincisi ise UTC’de yorumlar.
Güncel değerler için sınıf yöntemleri
Geçerli tarih veya saate ihtiyacınız olduğunda, Python basit yardımcılar sunar. Bunlar günlükleme, olay takibi ve gerçek zamanlı boru hatları için gereklidir.
from datetime import datetime, date, timezone
print(date.today())
print(datetime.now())
print(datetime.now(tz=timezone.utc)) # Python 3.12+ preferred
Bunlar size ihtiyaçlarınıza bağlı olarak geçerli sistem saatini yerel zamanda veya UTC’de verir.
datetime.fromtimestamp(1700000000)
datetime.utcfromtimestamp(1700000000)
Bunlar, epoch zaman damgalarını datetime nesnelerine dönüştürür. API veya veritabanı değerlerini ayrıştırırken son derece yaygındırlar.
Dizelerden ayrıştırma
Gerçek dünya veri kümeleri, zaman damgalarını sıklıkla metin olarak saklar. Python, bu dizeleri yapılandırılmış değerlere dönüştürmek için güvenilir araçlar sunar.
strptime()
from datetime import datetime
dt = datetime.strptime("2025-03-01 14:30", "%Y-%m-%d %H:%M")
print(dt)
strptime(), bir biçim deseni kullanarak bir dizeyi ayrıştırır. Dize tam olarak eşleşmezse, Python ValueError yükseltir.
from datetime import datetime
dt = datetime.strptime("not-a-date", "%Y-%m-%d")
Bu, giriş beklenen desenle eşleşmediği için başarısız olur.
fromisoformat()
datetime.fromisoformat("2025-03-01T14:30:00")
ISO 8601 dizeleri, yapısı standartlaştırıldığı için temiz şekilde ayrıştırılır. Bu, API’lerden veya modern veri boru hatlarından zaman damgalarını yüklemenin genellikle en kolay yoludur.
Tarih Aritmetiği Yapma
Zaman damgaları oluşturabildiğinizde, sıradaki adım onlarla çalışmaktır. Bunu süreler hesaplayarak, tarihleri kaydırarak veya aralıkları karşılaştırarak yapabilirsiniz.
Zamansal hesaplamalar için Timedelta
timedelta, “5 saat” veya “2 hafta” gibi sabit süreli dönemleri modellemek için kullanılır. Bu dönemler, zamanlama, günlükleme ve basit bir geri sayım gerektiğinde kullanışlıdır.
from datetime import datetime, timedelta
dt = datetime(2025, 3, 1, 14, 30)
new_dt = dt + timedelta(days=5)
print(new_dt)
Bu örnek, zaman damgasını beş gün ileri kaydırır.
start = datetime(2025, 3, 1, 9, 0)
end = datetime(2025, 3, 1, 14, 30)
duration = end - start
print(duration.total_seconds())
Burada, iki datetime’in çıkarılması size bir timedelta verir; bunu saniye, gün veya saate dönüştürebilirsiniz.
Sabit süreli vs. takvim farkında aritmetik
Tüm zaman birimleri eşit değildir. Ayların uzunluğu değişir, yıllarda artık gün olabilir ve ay sonu davranışı öngörülemez olabilir. Bu senaryolarda timedelta yeterli değildir.
dateutil.relativedelta “takvim farkında” aritmetiği ele alır:
from dateutil.relativedelta import relativedelta
from datetime import date
d = date(2025, 1, 31)
print(d + relativedelta(months=1))
Bu, eksik “February 31” senaryosunu doğru şekilde ele alarak tarihi uygun biçimde kaydırır.
Tarihleri Biçimlendirme ve Ayrıştırma
Datetime biçimlendirme her yerde karşımıza çıkar: API’ler belirli biçimler bekler, kullanıcılar okunabilir metinleri tercih eder ve günlükler tutarlı zaman damgası dizelerine dayanır. Python hem esnek biçimlendirmeyi hem de standart temsilleri destekler.
strftime ile dize biçimlendirme
strftime(), önceden tanımlanmış kodları kullanarak datetime nesnelerini biçimlendirilmiş dizelere dönüştürmenizi sağlar.
from datetime import datetime
dt = datetime(2025, 3, 1, 14, 30)
print(dt.strftime("%A, %B %d, %Y at %H:%M"))
Bu, haftanın günü ve tam ay adını içeren, insan tarafından okunabilir bir dize yazdırır.
dt.strftime("%Y-%m-%dT%H:%M:%S")
Bu, veri depolama veya API’ler için uygun, ISO benzeri bir dize üretir.
strptime ile dizeleri ayrıştırma
from datetime import datetime
dt = datetime.strptime("2025-03-01 14:30", "%Y-%m-%d %H:%M")
print(dt)
Bu, metni bir datetime nesnesine dönüştürür. Dize ile desen arasındaki herhangi bir uyuşmazlık hata yükseltir.
ISO 8601 ve RFC 3339 ile çalışma
ISO 8601, birçok bölgesel tarih biçiminde bulunan belirsizliği çözer. Python bunu kutudan çıktığı gibi destekler:
from datetime import datetime
dt = datetime.fromisoformat("2025-03-01T14:30:00")
print(dt.isoformat())
Bu, sistemler, API’ler veya veritabanları arasında veri alışverişi yaparken en güvenli biçimdir.
Saat Dilimlerini Ele Alma
Saat dilimleri, zamansal programlamadaki en zorlayıcı konulardan bazılarını ortaya çıkarır. Python, bilinçsiz (naive) ve bilinçli (aware) datetime nesneleri arasında ayrım yaparak ve gerçek dünyadaki saat dilimlerini ele almak için araçlar sağlayarak yardımcı olur.
Bilinçsiz vs. bilinçli datetime nesneleri
Bilinçsiz bir datetime’ın saat dilimi yoktur:
from datetime import datetime
naive_dt = datetime(2025, 3, 1, 14, 30)
print(naive_dt.tzinfo) # None
Bilinçli bir datetime, bir saat dilimi ofseti içerir:
from datetime import timezone, timedelta
aware_dt = naive_dt.replace(tzinfo=timezone(timedelta(hours=1)))
print(aware_dt)
Karşılaştırmalarda veya aritmetikte bilinçsiz ve bilinçli değerleri karıştırmak genellikle hatalara yol açar.
zoneinfo modülünü kullanma
Python'un zoneinfo modülü gerçek dünyadaki IANA saat dilimlerine erişim sağlar:
from zoneinfo import ZoneInfo
from datetime import datetime
dt = datetime(2025, 3, 1, 14, 30, tzinfo=ZoneInfo("Europe/Paris"))
print(dt)
Saat dilimi dönüştürme basittir:
dt.astimezone(ZoneInfo("America/New_York"))
Bu, aynı anı farklı bir yerel saat diliminde ifade eder.
Saat dilimleri arasında dönüştürme
Herhangi bir bilinçli zaman damgasını astimezone() kullanarak başka bir dilime dönüştürebilirsiniz:
from zoneinfo import ZoneInfo
dt_ny = dt.astimezone(ZoneInfo("America/New_York"))
print(dt_ny)
Yaygın bir en iyi uygulama, zaman damgalarını UTC’de saklamak ve yalnızca görüntülerken dönüştürmektir.
Tarihleri Karşılaştırma ve Filtreleme
Karşılaştırmalar neredeyse her iş akışında görülür. Günlükleri sıralamak, olayları filtrelemek veya bir şeyin bir eşikten önce mi sonra mı gerçekleştiğini belirlemek gibi durumları düşünüyorum.
from datetime import datetime
a = datetime(2025, 3, 1, 12, 0)
b = datetime(2025, 3, 1, 15, 0)
print(a < b) # True
Saat dilimi farkında karşılaştırmalar ofsetleri hesaba katar:
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
Koleksiyonları filtrelemek doğal şekilde çalışır:
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)
Bölgeler arasında çalışırken UTC’ye normalize etmek yardımcı olur.
Daha Gelişmiş Kullanım Durumları
Datetime, temel ayrıştırma ve aritmetiğin ötesinde birçok iş akışında karşımıza çıkar. Sıkça rastlayacağınız birkaç kalıp aşağıdadır.
Unix zaman damgaları
Unix zaman damgaları, 1 Ocak 1970’ten (UTC) beri geçen saniyeleri ölçer. Sistem programlamada ve API’lerde yaygın olarak kullanılırlar.
from datetime import datetime
dt = datetime.fromtimestamp(1700000000)
print(dt)
Milisaniye ve mikrosaniyeler ölçeklendirme gerektirir:
ts_ms = 1700000000000
dt_ms = datetime.fromtimestamp(ts_ms / 1000)
ts_us = 1700000000000000
dt_us = datetime.fromtimestamp(ts_us / 1_000_000)
Zamanlama ve zamanlayıcılar
schedule gibi kütüphaneler, görevlerin ne zaman çalışacağını belirlemek için datetime değerlerine dayanır. İster her birkaç saniyede bir işlev tetikleyin ister günün ilerleyen saatlerinde tek seferlik bir olayı zamanlayın, datetime bu karşılaştırmaların temelini sağlar.
Veri analizi kalıpları
Zaman temelli analiz ve gruplama için sıklıkla datetime öznitelikleri çıkarılır:
dt = datetime(2025, 3, 1, 14, 30)
print(dt.year)
print(dt.isocalendar())
pandas’ta dönemsel yeniden örnekleme son derece yaygındır:
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())
Sonuç
Daha fazla bilgi için Max Shrom’un hazırladığı Working with Dates and Times in Python kursumuzdaki bu videoya ve Jason Myers’ın Data Types for Data Science in Python kursuna bakabilirsiniz.
Ayrıca, dizeleri dönüştürmede biraz daha yardıma ihtiyacınız olursa Converting Strings to Dates as datetime Objects eğitimimize de göz atabilirsiniz.
Yapay zekâ, makine öğrenimi ve veri bilimi alanlarında uzmanlaşmış teknik yazar; karmaşık fikirleri anlaşılır ve erişilebilir kılar.

