"Beni eleştirenler, eğer yeterince zeki olsalardı, zaten benim yazdıklarımı okumazlardı." - Oscar Wilde"

Python ile Astronomik Namaz Vakti Hesaplama: PyEphem Kütüphanesi

Bu yazı, namaz vakitlerinin astronomik hesaplanmasını Python programlama dili ve PyEphem kütüphanesi kullanarak açıklıyor. Kur'an'a dayalı ve bilimsel temelli namaz vakti hesaplama algoritması, güneşin ufuk konumuna göre belirlenir. Aydın ili koordinatları üzerinden örneklendirilen bu çalışma, modern bilgisayar teknolojisinin dini uygulamalara nasıl hassas ve hızlı çözümler sunabildiğini gösteriyor.

yazı resim

Namaz vakitlerinin doğru hesaplanması, Kur'an'a dayalı şekilde astronomiye uygun olarak belirlenmesi gereken bir meseledir. Güneş'in ufka göre konumuna dayanan bu hesaplamalar, modern çağda bilgisayar astronomisi kütüphaneleri sayesinde saniyeler içinde ve yüksek hassasiyetle yapılabilir hale gelmiştir. Burada, Python programlama dili ile ephem (PyEphem) kütüphanesi kullanılarak namaz vakti hesaplama algoritması ele alınmaktadır. Koordinat olarak Türkiye'nin Aydın il merkezi merkez alınmış; 37.8402° Kuzey enlemi ve 27.8379° Doğu boylamı kullanılmıştır.

  1. Kullanılan Araçlar ve Kütüphaneler
    1.1 PyEphem
    PyEphem, astronomi hesaplamaları için geliştirilmiş güçlü bir Python kütüphanesidir. Gezegenlerin, yıldızların ve diğer gök cisimlerinin konumlarını yüksek doğrulukla hesaplayabilir. Kütüphanenin temelinde, 1980'lerde Brandon Rhodes tarafından C diliyle yazılmış XEphem motoru yatmaktadır. ephem.Observer sınıfı aracılığıyla gözlem noktası (enlem, boylam, basınç vb.) tanımlanır; ephem.Sun nesnesi ile güneş konumu anlık olarak sorgulanabilir.
    1.2 PyTZ
    pytz kütüphanesi, zaman dilimi dönüşümlerini yönetmek için kullanılır. Astronomik hesaplamalar evrensel koordinatlı zaman (UTC) üzerinden yürütülür; yerel saat gösterimi için Europe/Istanbul (UTC+3) zaman dilimine dönüşüm yapılır.
  2. Gözlem Noktasının Kurulumu
    Kod, önce bir ephem.Observer nesnesi oluşturarak enlem ve boylamı string formatında atar. observer.pressure = 1013 satırı atmosfer basıncını millibar cinsinden tanımlar; bu değer, atmosferik kırılma (refraksiyon) hesaplamalarında kullanılır ve güneş ışığının atmosferden geçerken kırılmasının ufuk hesaplarına olan etkisini modeller. Atmosfer basıncının doğru girilmesi, özellikle gün doğumu ve batımı hesaplarında birkaç saniyelik hassasiyet farkı oluşturur.
  3. Vakitlerin Hesaplanma Yöntemi
    3.1 Gün Doğumu (Şurûk) — İmsak Sonu
    observer.horizon = "-0:50"
    sunrise_utc = observer.next_rising(ephem.Sun()).datetime()
    Güneş'in üst kenarı, standart atmosferik kırılma ve güneş yarıçapı gözetilerek −0° 50' ufuk açısında iken gün doğumu gerçekleşmiş kabul edilir. Bu değer, NOAA ve pek çok uluslararası meteoroloji kuruluşunun benimsediği standarttır. Kod, observer.next_rising() metoduyla güneşin bu açıyı bir sonraki geçiş zamanını hesaplar.

3.2 Öğle (Zuhr)
observer.horizon = "0"
dhuhr_utc = observer.next_transit(ephem.Sun()).datetime()
Güneşin yerel meridyenden geçtiği an, yani güneşin gökyüzündeki en yüksek noktaya ulaştığı zaman öğle vaktini verir. next_transit() metodu bu meridyen geçişini hesaplar. Öğle vakti, diğer vakitlerin hesaplanmasında temel referans noktası işlevi görür.
3.3 İkindi (Asr)
İkindi vakti hesaplaması, algoritmik açıdan en özgün ve ilgi çekici kısımdır:
python
observer.date = dhuhr_utc
sun = ephem.Sun(observer)
alt = sun.alt # Öğledeki güneş yüksekliği (radyan)
tan_alt = math.tan(alt)
target_alt = math.atan(1.0 / (0.35 + tan_alt))
target_deg = math.degrees(target_alt)
observer.horizon = str(target_deg)
asr_utc = observer.next_setting(ephem.Sun()).datetime()
Bu formül, klasik İslam fıkhındaki gölge uzunluğu tanımını matematiksel olarak ifade eder. Hanefî mezhebine göre ikindi vakti, bir cismin gölgesinin kendi boyunun iki katına ulaştığı andır (Şafiî'de bir kat). Kodda kullanılan 0.35 katsayısı, astronomi standardına göre ayarlanmış ampirik bir değerdir. math.atan(1.0 / (0.35 + tan(öğle_yüksekliği))) formülü, güneşin o özel açıyı geçeceği zamanı dinamik biçimde hesaplar; bu açı her gün ve her enlem için farklıdır.
3.4 Akşam (Mağrib)
observer.horizon = "0"
sunset_utc = observer.next_setting(ephem.Sun()).datetime()
Akşam vakti, güneşin görünür diskin alt kenarı ufkun altına indiği andır. Kodda ufuk açısı sıfır olarak tanımlanmış; standart atmosferik kırılma etkisi PyEphem tarafından otomatik hesaplanmaktadır.

3.5 Sabah (Fecr / İmsak) ve Yatsı (İşa)
python
observer.horizon = f"-{yatsi_acisi}" # varsayılan: -9°
fajr_utc = observer.previous_rising(ephem.Sun()).datetime()
isha_utc = observer.next_setting(ephem.Sun()).datetime()
Sabah ve yatsı vakitleri, güneşin ufkun altında belirli bir açıya ulaştığı anlara karşılık gelir. Bu açı yatsi_acisi parametresiyle tanımlanmış olup değeri 9 derecedir.
| Kurum / Yöntem | Sabah Açısı | Yatsı Açısı |
|---|---|---|
| Diyanet İşleri Başkanlığı | 18° | 17° |
| ISNA (Kuzey Amerika) | 15° | 15° |
| MWL (Müslüman Dünya Birliği) | 18° | 17° |
| Kareem (Mısır) | 19.5° | 17.5° |
| Kur'an'a Uygun Olarak Kodda kullanılan | 9° | 9° |
Önemli not: Kodda kullanılan 9 derecelik açı, yaygın standartların oldukça altında ancak Kur'an'a uygun olan olduğu için belirlenmiş bir değerdir. Türkiye Diyanet İşleri Başkanlığı Kur'an'a aykırı şekilde 18° kullanmaktadır.
4. UTC ve Yerel Saat Yönetimindeki Kritik Noktalar
Kodun en dikkat çekici teknik özelliği, her hesaplamadan önce observer.date'in UTC cinsinden sıfırlanmasıdır:
python
observer.date = base_date # ⭐ KRİTİK
PyEphem'de observer.date bir kez güncellendikten sonra bir sonraki hesaplama bu güncellenmiş zamandan itibaren devam eder. Özellikle güneş batımı ve öğle hesaplamalarında, aynı observer nesnesi üzerinde art arda işlem yapılırken tarih kayması oluşabilir. Kodun her adımda base_date'e dönmesi bu hatayı önler. Benzer şekilde sabah ve yatsı hesaplamalarında sunrise_utc ve sunset_utc doğrudan UTC değerleri olarak kullanılmış; to_local() çıktıları olan yerel saat nesneleri bu aşamada kullanılmamıştır. Yerel saat nesneleri saat dilimi farkını bünyesinde taşıdığından bunların doğrudan ephem'e verilmesi ciddi hatalara yol açardı.

  1. Aydın İçin 25 Mart 2026 Vakitleri
    37.8402° K, 27.8379° D koordinatları ve 9° alacakaranlık açısıyla hesaplanan vakitler:
    KOD:
    import ephem
    import math
    import pytz
    utc = pytz.utc
    local_tz = pytz.timezone("Europe/Istanbul")
    def to_local(dt):
    dt = utc.localize(dt)
    return dt.astimezone(local_tz)
    def prayer_times_noaa(latitude, longitude, date_str, yatsi_acisi=9.0):
    observer = ephem.Observer()
    observer.lat = str(latitude)
    observer.lon = str(longitude)
    observer.pressure = 1013
    base_date = ephem.Date(date_str + " 00:00:00")
    observer.date = base_date

---- GÜN DOĞUM ----

observer.horizon = "-0:50"
sunrise_utc = observer.next_rising(ephem.Sun()).datetime()
sunrise = to_local(sunrise_utc)

---- GÜN BATIMI (senin istediğin gibi) ----

observer.date = base_date # ⭐ KRİTİK
observer.horizon = "0"
sunset_utc = observer.next_setting(ephem.Sun()).datetime()
sunset = to_local(sunset_utc)

---- ÖĞLE ----

observer.date = base_date # ⭐ KRİTİK
observer.horizon = "0"
dhuhr_utc = observer.next_transit(ephem.Sun()).datetime()
dhuhr = to_local(dhuhr_utc)

---- İKİNDİ ----

observer.date = dhuhr_utc
sun = ephem.Sun(observer)
alt = sun.alt
tan_alt = math.tan(alt)
target_alt = math.atan(1.0 / (0.35 + tan_alt))
target_deg = math.degrees(target_alt)
observer.horizon = str(target_deg)
asr_utc = observer.next_setting(ephem.Sun()).datetime()
asr = to_local(asr_utc)

---- SABAH ----

observer.date = sunrise_utc # ⭐ LOCAL değil UTC kullan
observer.horizon = f"-{yatsi_acisi}"
fajr_utc = observer.previous_rising(ephem.Sun()).datetime()
fajr = to_local(fajr_utc)

---- YATSI ----

observer.date = sunset_utc # ⭐ LOCAL değil UTC kullan
observer.horizon = f"-{yatsi_acisi}"
isha_utc = observer.next_setting(ephem.Sun()).datetime()
isha = to_local(isha_utc)
return {
"sabah": fajr,
"ogle": dhuhr,
"ikindi": asr,
"aksam": sunset,
"yatsi": isha
}

----------------- KULLANIM -----------------

latitude = 37.8402
longitude = 27.8379
date = "2026-03-25"
times = prayer_times_noaa(latitude, longitude, date)
print(f"vakitler ({date}):\n")
print("Sabah: ", times["sabah"].strftime("%H:%M:%S"))
print("Öğle: ", times["ogle"].strftime("%H:%M:%S"))
print("İkindi: ", times["ikindi"].strftime("%H:%M:%S"))
print("Akşam: ", times["aksam"].strftime("%H:%M:%S"))
print("Yatsı: ", times["yatsi"].strftime("%H:%M:%S"))

| Vakit | Saat (TR) |
|---|---|
| Sabah (Fecr) | 06:21:56 |
| Öğle (Zuhr) |13:14:36 |
| İkindi (Asr) |16:46:31 |
| Akşam (Mağrib) |19:25:15 |
| Yatsı (İşa) |20:08 |
25 Mart, ilkbahar ekinoksuna (20-21 Mart) çok yakın bir tarihtir. Bu dönemde gündüz ve gece süreleri neredeyse eşittir; güneş tam doğudan doğup tam batıdan batar. Öğle vakti güneş yerel meridyenden geçerken yaklaşık 50-51° yüksekliğe ulaşır; bu da ikindi açısının oldukça belirgin biçimde hesaplanabildiği anlamına gelir.
6. Algoritmanın Güçlü Yönleri
Güçlü Yönler
- Yüksek hassasiyet: PyEphem, güneş konumunu yay saniyesi mertebesinde hesaplar.
- Atmosferik kırılma: observer.pressure sayesinde gerçekçi refraksiyon modeli uygulanır.
- Dinamik ikindi hesabı: Gölge uzunluğu formülü, sabit açı kullanan yaklaşımlardan daha doğrudur.
- Taşınabilirlik: Herhangi bir koordinat ve tarih için çalışır.
- Alacakaranlık açısı: Kur'an'a uygun olarak 9° değeri belirlenmiştir.
Sunulan Python kodu, PyEphem kütüphanesinin gücünü İslami astronomi geleneğinin matematiksel mirasıyla harmanlayan, düzgün yapılandırılmış bir namaz vakti hesaplayıcısıdır. UTC/yerel saat ayrımına gösterilen özen, ikindi vakti için kullanılan dinamik gölge formülü ve her hesap adımında tarih referansının sıfırlanması bu kodun teknik olgunluğunu ortaya koymaktadır.

KİTAP İZLERİ

Ayaşlı ile Kiracıları

Memduh Şevket Esendal

Ankara'da Bir Apartman Dairesi: Cumhuriyet'in Mikrokozmosu Memduh Şevket Esendal'ın ilk olarak 1934'te yayımlanan ve adeta bir edebi zaman kapsülü niteliği taşıyan romanı Ayaşlı ile Kiracıları,
İncelemeyi Oku

Yorumlar

Başa Dön