2016-02-16 10 views
6

Nel tentativo di generare un intervallo di date semestrali utilizzando Python. Pandas fornisce una funzione pd.date_range per aiutare con questo, tuttavia, vorrei che il mio intervallo di date iniziasse dalla data di fine e iterino all'indietro.Pata data_range a partire dalla data di fine alla data di inizio

Per esempio dato l'input:

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

Il risultato è:

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

Come faccio a generare il seguente:

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

Rimosso la mia risposta iniziale. Penso che la cosa principale qui sia l'offset, giusto? – Maximilian

+0

@Maximilian sì, questo è un altro modo per dirlo. – pyCthon

risposta

4

Con l'uscita aggiornata (dalla modifica che hai fatto) si può fare qualcosa di simile a quanto segue:

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) 

questa è una soluzione piuttosto concisa, anche se non ho confrontato i tempi di esecuzione, quindi non sono sicuro di quanto sia veloce.

In pratica si tratta solo di creare le date necessarie come elenco e quindi di convertirle in un indice datetime.

2

Questo può essere fatto senza panda e utilizzando datutil invece. Tuttavia è più coinvolto di quanto forse dovrebbe:

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

Viene visualizzato un errore 'TypeError: argomento intero previsto, ottenuto float' sulla riga' next_date = '. – pyCthon

+0

@pyCthon quale riga next_date è? Il primo o l'altro nel ciclo for? Se il più tardi, allora potrebbe essere che non hai installato dateutil, che avrei dovuto menzionare. –

+0

Il primo, dateutil è installato, ho ''2.4.2'' – pyCthon

Problemi correlati