SORU
29 HAZİRAN 2009, PAZARTESİ


Python tarih aralığı ile yineleme

Bunu yapmak için aşağıdaki kodu var, ama bunu daha iyi nasıl yapabilirim? Şu anda iç içe geçmiş döngüler daha iyi olduğunu düşünüyorum, ama liste bir anlama jeneratör varsa Perl-bir-linerish almaya başlıyor.

day_count = (end_date - start_date).days   1
for single_date in [d for d in (start_date   timedelta(n) for n in range(day_count)) if d <= end_date]:
    print strftime("%Y-%m-%d", single_date.timetuple())

Notlar

  • Aslında yazdırmak için bunu kullanıyorum. Bu sadece gösteri amaçlı.
  • start_date end_date değişkenleri, zaman damgaları ihtiyacım yok çünkü datetime.date nesnelerdir. (Bir rapor üretmek için kullanılan olacaklar).

Örnek Çıktı

2009-05-30 son 2009-06-09 tarihi: başlangıç olarak

2009-05-30
2009-05-31
2009-06-01
2009-06-02
2009-06-03
2009-06-04
2009-06-05
2009-06-06
2009-06-07
2009-06-08
2009-06-09

CEVAP
29 HAZİRAN 2009, PAZARTESİ


Neden iç içe iki yineleme var mı? Benim için tek bir yineleme ile aynı veri listesi oluşturur:

for single_date in (start_date   timedelta(n) for n in range(day_count)):
    print ...

Ve bir liste saklanan, tek bir jeneratör yineledi. Ayrıca "" jeneratör gereksiz gibi görünüyor. eğer

Sonuçta, doğrusal bir dizi sadece bir yineleyici, iki istemeyecek.

John Machin ile tartışma raporu"

Belki de en zarif bir çözüm oluşturucu bir işlev tamamen tarih aralığı/soyut yineleme gizlemek için kullanıyor:

from datetime import timedelta, date

def daterange(start_date, end_date):
    for n in range(int ((end_date - start_date).days)):
        yield start_date   timedelta(n)

start_date = date(2013, 1, 1)
end_date = date(2015, 6, 2)
for single_date in daterange(start_date, end_date):
    print single_date.strftime("%Y-%m-%d")

NOT: Bu yineleme durur yerleşik range() fonksiyonu ile tutarlılık İçinönceulaşma end_date. Senin gibi range() ile dahil yineleme kullanmak için bir sonraki gün, yani.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CNET

    CNET

    5 Mayıs 2006
  • Eddie Bravo

    Eddie Bravo

    17 EKİM 2006
  • PoreoticsHD

    PoreoticsHD

    22 NİSAN 2010