2016-02-16 37 views
6

Khi đang cố gắng tạo một phạm vi ngày bán niên sử dụng Python. Pandas cung cấp chức năng pd.date_range để trợ giúp việc này tuy nhiên tôi muốn phạm vi ngày của tôi bắt đầu từ ngày kết thúc và lặp lại.Pandas date_range bắt đầu từ ngày kết thúc đến ngày bắt đầu

Ví dụ cho các đầu vào:

start = datetime.datetime(2016 ,2, 8) 
end = datetime.datetime(2018 , 6, 1) 
pd.date_range(start, end, freq='6m') 

Kết quả là:

DatetimeIndex(['2016-02-29', '2016-08-31', '2017-02-28', '2017-08-31', 
       '2018-02-28']) 

Làm thế nào tôi có thể tạo ra những điều sau đây:

DatetimeIndex(['2016-02-08', '2016-06-01', '2016-12-01', '2017-06-01', 
       '2017-12-01', '2018-06-01']) 
+1

Đã xóa câu trả lời ban đầu của tôi. Tôi nghĩ rằng điều chính ở đây là bù đắp, đúng không? – Maximilian

+0

@Maximilian yeah đó là một cách khác để đặt nó. – pyCthon

Trả lời

4

Với sản lượng cập nhật (từ chỉnh sửa bạn đã thực hiện), bạn có thể làm điều gì đó như sau:

from pandas.tseries.offsets import DateOffset 

end = datetime.datetime(2018 , 6, 1) 
start = datetime.datetime(2016 ,2, 8) 
#Get the range of months to cover 
months = (end.year - start.year)*12 + end.month - start.month 
#The frequency of periods 
period = 6 # in months 

pd.DatetimeIndex([end - DateOffset(months=e) for e in range(0, months, period)][::-1]).insert(0, start) 

Đây là một giải pháp khá súc tích, mặc dù tôi không so sánh runtimes vì ​​vậy tôi không chắc nó nhanh như thế nào.

Về cơ bản, đây chỉ là việc tạo ngày bạn cần làm danh sách, sau đó chuyển đổi nó thành chỉ mục ngày giờ.

2

Điều này có thể được thực hiện mà không cần gấu trúc và sử dụng datutil thay thế. Tuy nhiên nó là tham gia nhiều hơn so với nó có lẽ nên:

from datetime import date 
import math 
from dateutil.relativedelta import relativedelta 

#set up key dates 
start = date(2016 ,2, 8) 
end = date(2018 , 6, 1) 

#calculate date range and number of 6 month periods 
daterange = end-start 
periods = daterange.days *2//365 

#calculate next date in sequence and check for year roll-over 
next_date = date(start.year,math.ceil(start.month/6)*6,1) 
if next_date < start: next_date = date(next_date.year+1,next_date.month,1) 

#add the first two values to a list 
arr = [start.isoformat(),next_date.isoformat()] 

#calculate all subsequent dates using 'relativedelta' 
for i in range(periods): 
    next_date = next_date+ relativedelta(months=+6) 
    arr.append(next_date.isoformat()) 


#display results 
print(arr) 
+0

Tôi nhận được một lỗi 'TypeError: đối số nguyên dự kiến, có float' trên' next_date = 'dòng. – pyCthon

+0

@pyCthon mà dòng next_date là nó? Người đầu tiên hoặc người trong vòng lặp for? Nếu sau này, có thể là bạn không cài đặt dateutil, mà tôi nên đề cập đến. –

+0

Đầu tiên, dateutil được cài đặt, tôi có ''2.4.2'' – pyCthon

Các vấn đề liên quan