2016-02-16 9 views
6

In dem Versuch, eine Reihe von Halbjahresdaten mit Python zu generieren. Pandas bietet eine Funktion pd.date_range zu helfen, aber ich möchte, dass mein Datumsbereich vom Enddatum beginnt und rückwärts iteriert.Pandas date_range beginnend mit dem Enddatum bis zum Startdatum

Zum Beispiel gegeben, um die Eingabe:

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

Das Ergebnis ist:

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

Wie kann ich folgendes erzeugen:

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

Meine erste Antwort entfernt. Ich denke die Hauptsache hier ist der Offset, ist das richtig? – Maximilian

+0

@Maximilian ja das ist eine andere Art, es zu sagen. – pyCthon

Antwort

4

Mit der aktualisierten Ausgabe (vom bearbeiten Sie gemacht) Sie können so etwas wie das folgende tun:

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) 

Dies ist eine ziemlich kurze Lösung ist, obwohl ich Laufzeiten nicht verglichen habe, bin ich mir nicht sicher, wie schnell es ist.

Im Grunde erstellt dies nur die Daten, die Sie als Liste benötigen, und konvertiert sie dann in einen Datetime-Index.

2

Dies kann ohne Pandas und unter Verwendung datutil statt. Doch es mehr beteiligt ist, als es vielleicht sollte:

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

Ich erhalte einen Fehler 'TypeError: Integer-Argument erwartet, bekam Float 'auf der' next_date = 'Zeile. – pyCthon

+0

@pyCthon welche next_date-Zeile ist das? Der erste oder der erste in der for-Schleife? Wenn das später, dann könnte es sein, dass du datautil nicht installiert hast, was ich hätte erwähnen sollen. –

+0

Die erste, dateutil ist installiert, ich habe '' 2.4.2'' – pyCthon

Verwandte Themen