2010-02-19 10 views
16

मैं पाइथन का उपयोग करके पुनरावर्ती तिथियां कैसे उत्पन्न कर सकता हूं? उदाहरण के लिए मैं "हर दूसरे महीने के तीसरे शुक्रवार" के लिए पुनरावर्ती तारीख उत्पन्न करना चाहता हूं। मैं दैनिक, साप्ताहिक, मासिक, वार्षिक (यानी, आउटलुक एक्सप्रेस में पुनरावृत्ति समारोह के समान) के लिए पुनरावर्ती तिथियां उत्पन्न करना चाहता हूं।पायथन का उपयोग कर पुनरावर्ती तिथियां उत्पन्न करना?

+1

आपने अभी तक क्या कोड लिखा है? कृपया आपके द्वारा लिखे गए कोड को पोस्ट करें। –

उत्तर

24
import dateutil.rrule as dr 
import dateutil.parser as dp 
import dateutil.relativedelta as drel 

start=dp.parse("19/02/2010") # Third Friday in Feb 2010 

यह हर महीने

rr = dr.rrule(dr.MONTHLY,byweekday=drel.FR(3),dtstart=start, count=10) 

यह प्रिंट की तीसरे शुक्रवार को उत्पन्न करता है प्रत्येक तीसरे शुक्रवार:

print map(str,rr) 
# ['2010-02-19 00:00:00', '2010-03-19 00:00:00', '2010-04-16 00:00:00', '2010-05-21 00:00:00', '2010-06-18 00:00:00', '2010-07-16 00:00:00', '2010-08-20 00:00:00', '2010-09-17 00:00:00', '2010-10-15 00:00:00', '2010-11-19 00:00:00'] 

rr एक iterable है, तो आप अंकन टुकड़ा करने की क्रिया हर बाहर लेने के लिए उपयोग कर सकते हैं अन्य वस्तु यह हर दूसरे महीने के तीसरे शुक्रवार प्रिंट:

print map(str,rr[::2]) 
# ['2010-02-19 00:00:00', '2010-04-16 00:00:00', '2010-06-18 00:00:00', '2010-08-20 00:00:00', '2010-10-15 00:00:00'] 

ऊपर, मैं str इस्तेमाल किया उत्पादन एक छोटा सा सुंदर बनाना करने के। तिथियों की अधिक लचीली स्ट्रिंग स्वरूपण के लिए, strftime का उपयोग करें: http://au2.php.net/strftime या सभी विकल्पों के लिए स्ट्रैटाइम के लिए मैन पेज देखें।

print [d.strftime('%d/%m/%Y') for d in rr[::2]] 
# ['19/02/2010', '16/04/2010', '18/06/2010', '20/08/2010', '15/10/2010'] 
+0

+1 क्योंकि मैंने इस तरह के समान प्रश्न का उत्तर देने के लिए आपके उत्कृष्ट उदाहरण का उपयोग किया है: http://stackoverflow.com/questions/3099007/date-library-capable-of-calculating-things-like- हर- तीसरा- बुधवार – bernie

0

आप dateutil एक कोशिश कर सकते हैं - विशेष रूप से इसके रिलेटिवेटा और क्रूर fetures।

+0

मैं निम्नलिखित कोड का उपयोग करें: प्रिंट सूची (rrule (दैनिक, गिनती = 10, dtstart = पार्स ("19/02/2010"))) बाहर कर दिया है लगता है: [datetime.datetime (2010, 2, 1 9, 0, 0), डेटाटाइम डॉटटाइम (2010, 2, 20, 0, 0), डेटाटाइम डेटाटाइम (2010, 2, 21, 0, 0), डेटाटाइम। टाइमटाइम (2010, 2, 22 , 0, 0), datetime.datetime (2010, 2, 23, 0, 0), datetime.datetime (2010, 2, 24, 0, 0), datetime.datetime (2010, 2, 25, 0, 0) , datetime.datetime (2010, 2, 26, 0, 0), datetime.datetime (2010, 2, 27, 0, 0), datetime.datetime (2010, 2, 28, 0, 0)] लेकिन मैं आउटपुट जैसे: 1 9/02/2010 20/02/2010 21/02/2010 । । । क्या यह बदलना संभव है? – Nimmy

+0

इस कोड को शामिल करने के लिए प्रश्न को संपादित कर सकता है ताकि इसे पढ़ा जा सके? – pwdyson

+0

@nimmyliji: तो आप पुनरावर्ती तिथियों के बारे में नहीं पूछ रहे हैं, लेकिन तारीख स्वरूपण के बारे में नहीं पूछ रहे हैं। –

0

आप इसे स्वयं लिखने का प्रयास कर सकते हैं। , अब

import datetime 

def dateiter(start, resolution): 
    date = start 
    while True: 
      yield date 
      date += resolution 

आप दिनांक पैदा करते हैं और उन्हें फ़िल्टर कर सकते हैं: आपको पहले एक इटरेटर जो किसी दिए गए अंतराल के द्वारा अलग तिथियों उत्पन्न करता है की आवश्यकता होगी

# generate a list of every tuesday of february 
# this iterates over every day from now, and filtered according to the rules 
# warning: infinite generator below, there is nothing to end the iteration 
tuesdays_of_february = (date for date in dateiter(datetime.datetime.now(), datetime.timedelta(days=1)) if date.weekday() == 4 and date.month == 2) 

आप जब तक आप पर्याप्त तिथि होती है इटरेटर खुद फोन कर सकते हैं :

>>> from itertools import * 
>>> 
>>> # get the five next valid dates: 
>>> list(islice(tuesdays_of_february),5) 
[datetime.datetime(2010, 2,26, 14, 25, 46, 171000), datetime.datetime(2011, 2, 4 
, 14, 25, 46, 171000), datetime.datetime(2011, 2, 11, 14, 25, 46, 171000), datet 
ime.datetime(2011, 2, 18, 1 4, 25, 46, 171000), datetime.datetime(2011, 2, 25 
, 14, 25, 46, 171000)] 
>>> 
>>> # or until a condition is met: 
>>> list(takewhile(lambda date: date.year < 2014, tuesdays_of_february)) 
[datetime.datetime(2012, 2, 3, 14, 25, 46, 171000), datetime.datetime(2012, 2, 1 
0, 14, 25, 46, 171000), datetime.datetime(2012, 2, 17, 14, 25, 46, 171000), date 
time.datetime(2012, 2, 24, 14, 25, 46, 171000), datetime.datetime(2013, 2, 1, 14 
, 25, 46, 171000), datetime.datetime(2013, 2, 8, 14, 25, 46, 171000), datetime.d 
atetime(2013, 2, 15, 14, 25, 46, 171000), datetime.datetime(2013, 2, 22, 14, 25, 
46, 171000)] 
:

>>> next(tuesdays_of_february) 
datetime.datetime(2010, 2, 19, 14, 25, 46, 171000) 

अब, आप परिणामों को सीमित करने की जरूरत है

datetime मॉड्यूल के लिए प्रलेखन पर नज़र डालना न भूलें।

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