2012-07-03 51 views
5

Tình huống: Tôi đang cố gắng xây dựng một phương thức đơn giản chấp nhận hai số nguyên khác nhau đại diện cho hai ngày khác nhau. 20120525 cho ngày 25 tháng 5 năm 2012 và 20120627 cho ngày 26 tháng 6 năm 2012 làm ví dụ. Tôi muốn phương thức này trả về một danh sách các kiểu số nguyên đại diện cho tất cả các ngày giữa hai tham số ngày tháng.Làm thế nào để có được tất cả các ngày (tháng, ngày và năm) giữa hai ngày trong python?

Câu hỏi: Tôi có thể nhận được bất kỳ đề xuất nào về cách thực hiện việc này và cách xử lý các tháng trong số 28, 29, 30 hoặc 31 ngày trong mỗi lần. Tôi nghĩ rằng tôi có thể làm điều này bằng cách trích xuất các số như số nguyên thông qua phân chia/modding lũy ​​thừa của 10, và sau đó tăng các con số như vậy với các điều kiện cụ thể ở trên, nhưng tôi cảm thấy như phải có một cách dễ dàng hơn để làm điều này.

Trả lời

19

Bạn không phải phát minh lại bánh xe. Chỉ cần phân tích các chuỗi thành các đối tượng datetime và để cho trăn làm toán cho bạn:

from dateutil import rrule 
from datetime import datetime 

a = '20120525' 
b = '20120627' 

for dt in rrule.rrule(rrule.DAILY, 
         dtstart=datetime.strptime(a, '%Y%m%d'), 
         until=datetime.strptime(b, '%Y%m%d')): 
    print dt.strftime('%Y%m%d') 

in

20120525 
20120526 
20120527 
… 
20120625 
20120626 
20120627 
+5

TIL dateutil.rrule. – DSM

2

Một giải pháp thay thế mà không sử dụng rrule goes here:

import datetime 

d1 = datetime.date(2015, 1, 1) 
d2 = datetime.date(2015, 2, 6) 
days = [d1 + datetime.timedelta(days=x) for x in range((d2-d1).days + 1)] 

for day in days: 
    print(day.strftime('%Y%m%d')) 

Output:

20150101 
20150102 
20150103 
<snip> 
20150205 
20150206 
0

Bạn có thể sử dụng pandas.date_range,

import pandas 

pd.date_range('2012-05-25', '2012-06-27', freq='D') 

mà sẽ tạo ra,

DatetimeIndex(['2012-05-25', '2012-05-26', '2012-05-27', '2012-05-28', 
       '2012-05-29', '2012-05-30', '2012-05-31', '2012-06-01', 
       ... 
       '2012-06-22', '2012-06-23', '2012-06-24', '2012-06-25', 
       '2012-06-26', '2012-06-27'], 
       dtype='datetime64[ns]', freq='D') 
Các vấn đề liên quan