2008-09-30 9 views
46

मैं दिन, घंटों, हफ्तों या महीनों के बाद एक समय पर कैसे पुन: प्रयास करूं?पायथन में दिन, घंटे, सप्ताह और महीनों के बाद एक समय के दौरान फिर से कैसे शुरू करें?

कुछ की तरह:

for date in foo(from_date, to_date, delta=HOURS): 
    print date 

कहाँ foo एक समारोह है, पुनरावर्तक लौटने। मैं कैलेंडर मॉड्यूल देख रहा हूं, लेकिन यह केवल एक विशिष्ट वर्ष या महीने के लिए काम करता है, तिथियों के बीच नहीं।

+0

या, क्या आप उपर्युक्त हस्ताक्षर के साथ एक समारोह चाहते हैं? –

उत्तर

75

उपयोग dateutil और उसके rrule कार्यान्वयन, इसलिए जैसे:

from dateutil import rrule 
from datetime import datetime, timedelta 

now = datetime.now() 
hundredDaysLater = now + timedelta(days=100) 

for dt in rrule.rrule(rrule.MONTHLY, dtstart=now, until=hundredDaysLater): 
    print dt 

आउटपुट

2008-09-30 23:29:54 
2008-10-30 23:29:54 
2008-11-30 23:29:54 
2008-12-30 23:29:54 
है 0

मासिक रूप से किसी भी, मासिक, सप्ताहांत, दैनिक, पूरी तरह से, या दूसरे के साथ मासिक रूप से बदलें। Dtstart को बदलें और जब भी आप चाहते हैं कि डेटाटाइम ऑब्जेक्ट के साथ।

इस नुस्खा को मासिक रूप से सभी मामलों में काम करने का लाभ है। केवल मुझे पता चल सकता है कि यदि आप एक दिन संख्या पास करते हैं जो सभी महीनों के लिए मौजूद नहीं है, तो यह उन महीनों को छोड़ देता है।

+1

http://niemeyer.net/python-dateutil बताता है कि "महीने के निर्दिष्ट दिन की तारीख को पुनर्प्राप्त करने के लिए इसका उपयोग कैसे करें, जब तक कि यह परे न हो महीने का अंत, इस मामले में यह महीने का आखिरी दिन होगा "। यह आपके द्वारा सूचीबद्ध एक चेतावनी को ठीक करता है। उदाहरण के तौर पर, अब = डेटाटाइम (2010, 8, 31, 1, 1, 1); rtle.rrule में dt के लिए (rrule.MONTHLY, dtstart = now, bymonthday = (31, -1), गिनती = 6): प्रिंट डीटी – Smerity

-1

यह पुस्तकालय एक आसान कैलेंडर उपकरण प्रदान करता है: mxDateTime, कि, पर्याप्त :)

38

मुझे नहीं लगता कि अजगर पुस्तकालय में एक विधि है होना चाहिए लेकिन आप आसानी से एक अपने आप को datetime मॉड्यूल का उपयोग कर बना सकते हैं:

from datetime import date, datetime, timedelta 

def datespan(startDate, endDate, delta=timedelta(days=1)): 
    currentDate = startDate 
    while currentDate < endDate: 
     yield currentDate 
     currentDate += delta 

तो फिर तुम इसे इस तरह इस्तेमाल कर सकते हैं:

>>> for day in datespan(date(2007, 3, 30), date(2007, 4, 3), 
>>>      delta=timedelta(days=1)): 
>>>  print day 
2007-03-30 
2007-03-31 
2007-04-01 
2007-04-02 

या, यदि आप अपने डेल्टा छोटा करने के लिए चाहते हैं:

>>> for timestamp in datespan(datetime(2007, 3, 30, 15, 30), 
>>>       datetime(2007, 3, 30, 18, 35), 
>>>       delta=timedelta(hours=1)): 
>>>  print timestamp 
2007-03-30 15:30:00 
2007-03-30 16:30:00 
2007-03-30 17:30:00 
2007-03-30 18:30:00 
+1

आप एक महीने का टाइमडेल्टा निर्दिष्ट नहीं कर सकते हैं – dangonfast

6

महीनों में पुनरावृत्ति के लिए आपको एक अलग नुस्खा की आवश्यकता है, क्योंकि टाइमडेल्टस "एक महीने" व्यक्त नहीं कर सकता है।

from datetime import date 

def jump_by_month(start_date, end_date, month_step=1): 
    current_date = start_date 
    while current_date < end_date: 
     yield current_date 
     carry, new_month = divmod(current_date.month - 1 + month_step, 12) 
     new_month += 1 
     current_date = current_date.replace(year=current_date.year + carry, 
              month=new_month) 

(एनबी: आप महीने से 1 घटाना के लिए मापांक आपरेशन फिर इसे वापस new_month को, datetime.date आरंभ में 1. में जोड़ने के महीनों के बाद से है)

+0

दो चीजें: - यह कोड 'ValueError' बढ़ाता है यदि आप start_date का दिन किसी ऐसे नंबर पर सेट करते हैं जो हर महीने में मौजूद नहीं है - शायद, ठीक उसी कारण से कोई महीना नहीं है -timedelta; मैं एक अच्छा अनुमान के लिए 'timedelta (दिन = 30)' का उपयोग करने का सुझाव दूंगा। – DzinX

+0

अच्छा पकड़ो। कभी-कभी, हालांकि, अनुमान पर्याप्त नहीं है (मेरा "मेरा किराया भुगतान करें" अनुस्मारक * हर महीने के पहले 6:30 बजे होना चाहिए)। रेसिपी को संशोधित किया जा सकता है-शायद कुछ अतिरिक्त राज्यों के साथ- जोन कार्यक्षमता प्रदान करने के लिए, जो भी हो। – giltay

+0

आप 2 9 फरवरी को साल-दर-साल फिर से शुरू होने वाली समस्याओं में भी भाग ले सकते हैं। – giltay

-2

आप सही ढंग से इस काम करने के लिए इस लाइन को संशोधित करना चाहिए:

CURRENT_DATE = current_date.replace (, वर्ष = current_date.year + ले जाने के महीने = new_month, दिन = 1)

;)

0

महीना यात्रा दृष्टिकोण:

def months_between(date_start, date_end): 
    months = [] 

    # Make sure start_date is smaller than end_date 
    if date_start > date_end: 
     tmp = date_start 
     date_start = date_end 
     date_end = tmp 

    tmp_date = date_start 
    while tmp_date.month <= date_end.month or tmp_date.year < date_end.year: 
     months.append(tmp_date) # Here you could do for example: months.append(datetime.datetime.strftime(tmp_date, "%b '%y")) 

     if tmp_date.month == 12: # New year 
      tmp_date = datetime.date(tmp_date.year + 1, 1, 1) 
     else: 
      tmp_date = datetime.date(tmp_date.year, tmp_date.month + 1, 1) 
    return months 

अधिक कोड लेकिन यह समय की जाँच की लंबी अवधि के साथ ठीक व्यवहार है कि दिया दिनांकों क्रम में हैं क्या करेंगे ...

संबंधित मुद्दे