如何使用Python生成重複日期?例如,我想生成「每隔一個月的第三個星期五」的重複日期。我想要生成每日,每週,每月,每年的重複日期(即與Outlook Express中的重現功能相同)。使用python生成重複日期?
回答
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是一個迭代的,所以你可以用切片的符號來挑選出每其他項目。這將打印每隔一個月的第三個星期五:
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或針對所有選項的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']
+1因爲我無恥地使用你的優秀例子來回答這個非常相似的SO問題:http://stackoverflow.com/questions/3099007/date-library-capable-of-calculating-things-like-every-third-tuesday – bernie 2010-06-23 05:20:49
你可以試一試dateutil - 尤其是它的相對性和魯棒性。
我使用下面的代碼: 打印列表(RRULE(每天,數= 10,爲dtstart =解析( 「19/02/2010」))) 的出來說就是看起來像: [datetime.datetime( (2010,2,2,0,0,0),datetime.datetime(2010,2,20,0,0),datetime.datetime(2010,2,2,0,0),datetime.datetime(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,2,0,0,0),datetime.datetime(2010,2,28,0,0)] 但是我想要輸出如: 19/02/2010 20/02/2010 21/02/2010 。 。 。 可以更改嗎? – Nimmy 2010-02-19 11:38:14
可以編輯問題以包含此代碼,以便它可以被讀取? – pwdyson 2010-02-19 12:01:30
@nimmyliji:所以你不問關於重複日期,而是關於日期格式。 – 2010-02-19 12:10:28
你可能會嘗試自己寫這個。你首先需要產生一個給定的間隔隔開日期迭代器:
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)
你可以自己調用迭代,直到你有足夠的日期:
>>> next(tuesdays_of_february)
datetime.datetime(2010, 2, 19, 14, 25, 46, 171000)
現在,你需要限制的結果:
>>> 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)]
不要忘記查看datetime
模塊的文檔。
- 1. 使用重複間隔生成日期列表
- 2. 使用重複日期,例如週年紀念日,使用Javascript的生日
- 3. 生成日期的陣列在python
- 4. 在Python中生成一週的日期?
- 5. 使用以獲取生成的日期並重用它jquery
- 6. 當重複ID是與格式previous_event_id生成+ _R +日期
- 7. LotusScript生成的Lotus Appointment文檔中重複的日期
- 8. 按日期範圍和重複在python
- 9. 使用CTE在Sqlite上生成日期
- 10. Log4Net RollingFileAppender生成重複日誌
- 11. Python,使用ReportLab.Platypus SimpleDocTemplate生成PDF,標題中的日期/時間
- 12. F#生成日期
- 13. Asp.net日曆 - 生成日期
- 14. 使用日期字段(不重複)
- 15. 是否可以使用重複日期?
- 16. 使用生成的日期列表比較列日期列 - MYSQL
- 17. 使用日期和時間生成日期對象
- 18. MySQL日期重複
- 19. 使用java生成JasperReports生成mysql日期時間格式
- 20. 如何生成日期付款日期
- 21. 使用UUID生成可重複的ID?
- 22. NSdate星期日重複日期
- 23. 生成NG-重複
- 24. 生成無重複
- 25. 生成即使空2日期間
- 26. Python日期範圍生成器在工作日內
- 27. 生成兩個日期
- 28. 生成一系列日期
- 29. 生成隨機日期
- 30. 生成每週日期
到目前爲止你寫了什麼代碼?請發佈你寫的代碼。 – 2010-02-19 11:06:24