2016-06-17 52 views
5

Da pd.date_range('2016-01', '2016-05', freq='M',).strftime('%Y-%m'), il mese scorso è 2016-04, ma mi aspettavo che fosse 2016-05. Mi sembra che questa funzione si comporti come il metodo range, in cui il parametro finale non è incluso nell'array di restituzione.Come includere la data di fine nel metodo date_range pandas?

C'è un modo per ottenere il mese finale incluso nell'array di restituzione, senza elaborare la stringa per il mese finale?

risposta

2

Un modo per farlo senza fare confusione con capire mese si conclude te stesso.

pd.date_range(*(pd.to_datetime(['2016-01', '2016-05']) + pd.offsets.MonthEnd()), freq='M') 

DatetimeIndex(['2016-01-31', '2016-02-29', '2016-03-31', '2016-04-30', 
      '2016-05-31'], 
      dtype='datetime64[ns]', freq='M') 
+0

Con questa soluzione non ho bisogno di pasticciare con giorni e (n + 1) mese. – srodriguex

0

Non penso. È necessario aggiungere la (n + 1) di confine

pd.date_range('2016-01', '2016-06', freq='M').strftime('%Y-%m') 

L'inizio e fine date sono rigorosamente compreso. Quindi non sarà generare eventuali date al di fuori di quelle date, se specificato. http://pandas.pydata.org/pandas-docs/stable/timeseries.html

In entrambi i casi, è necessario aggiungere manualmente alcune informazioni. Credo che aggiungere solo un altro mese non sia molto lavoro.

+0

Questa citazione dai documenti è valida quando 'freq = 'D'', quando è mensile non è valido per la data di fine. – srodriguex

+0

ok. non cambia il fatto che devi aggiungere il tuo limite :) –

0

include il giorno quando si specificano le date in date_range chiamata

pd.date_range('2016-01-31', '2016-05-31', freq='M',).strftime('%Y-%m') 

array(['2016-01', '2016-02', '2016-03', '2016-04', '2016-05'], 
     dtype='|S7') 
+0

Se aggiungi un giorno manualmente, allora potresti anche solo aggiungere un altro mese non pensi –

+0

No. Posso immaginare un bisogno e un motivo per preferire entrambi sulla situazione – piRSquared

4

È possibile utilizzare .union per aggiungere il valore logico successivo dopo l'inizializzazione del date_range. Dovrebbe funzionare come scritto per qualsiasi frequenza:

d = pd.date_range('2016-01', '2016-05', freq='M') 
d = d.union([d[-1] + 1]).strftime('%Y-%m') 

In alternativa, è possibile utilizzare al posto di period_rangedate_range. A seconda di cosa si intende fare, questo potrebbe non essere la cosa giusta da usare, ma soddisfa la tua domanda:

pd.period_range('2016-01', '2016-05', freq='M').strftime('%Y-%m') 

In entrambi i casi, l'output risultante è come previsto:

['2016-01' '2016-02' '2016-03' '2016-04' '2016-05'] 
+0

Grazie per period_range, questo è quello che stavo cercando. – Tickon

2

Per la folla successiva. Puoi anche provare a utilizzare la frequenza di inizio mese.

>>> pd.date_range('2016-01', '2016-05', freq='MS', format = "%Y-%m") 
DatetimeIndex(['2016-01-01', '2016-02-01', '2016-03-01', '2016-04-01', 
       '2016-05-01'], 
       dtype='datetime64[ns]', freq='MS')