2016-02-16 3 views
6

पाइथन का उपयोग करके अर्ध-वार्षिक तिथियों की एक श्रृंखला उत्पन्न करने की कोशिश कर रहा है। Pandas इस के साथ मदद करने के लिए pd.date_range फ़ंक्शन प्रदान करता है, हालांकि मैं अपनी दिनांक सीमा को अंतिम तिथि से शुरू करना चाहता हूं और पीछे की ओर फिर से शुरू करना चाहता हूं।पांड तिथि दिनांक से शुरू होने की तारीख से

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

परिणाम है::

उदाहरण के लिए इनपुट दिया

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

मैं निम्नलिखित कैसे उत्पन्न कर सकते हैं:

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

मेरा प्रारंभिक उत्तर हटा दिया गया। मुझे लगता है कि यहां मुख्य बात ऑफ़सेट है, क्या यह सही है? – Maximilian

+0

@ मैक्सिमिलियन हाँ यह इसे रखने का एक और तरीका है। – pyCthon

उत्तर

4
अद्यतन उत्पादन के साथ

(संपादित कर की गई) आप निम्नलिखित की तरह कुछ कर सकते हैं:

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) 

यह एक काफी संक्षिप्त समाधान है, हालांकि मैंने रनटाइम की तुलना नहीं की थी इसलिए मुझे यकीन नहीं है कि यह कितनी तेज़ है।

असल में यह सिर्फ एक सूची के रूप में आपको आवश्यक तिथियां बना रहा है, और फिर इसे डेटाटाइम इंडेक्स में परिवर्तित कर रहा है।

2

यह पांडा के बिना और datutil के बजाय किया जा सकता है। हालांकि यह और अधिक शामिल की तुलना में यह शायद चाहिए है:

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

मुझे एक त्रुटि मिल रही है 'TypeError: पूर्णांक तर्क अपेक्षित, 'next_date =' लाइन पर फ़्लोट हो गया। – pyCthon

+0

@pyCthon जो अगली_डेट लाइन है? लूप के लिए पहला या एक? यदि बाद में, तो यह हो सकता है कि आपके पास डेट्यूटिल स्थापित न हो, जिसे मैंने उल्लेख किया हो। –

+0

पहला, डेट्यूटिल स्थापित है, मेरे पास '2.4.2'' – pyCthon

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