2015-08-23 10 views
12

Utilizzando la funzione pandas.date_range(startdate, periods=n, freq=f) è possibile creare un intervallo di oggetti panda Timestamp in cui il parametro opzionale freq denota la frequenza (secondo, minuto, ora, giorno ...) nell'intervallo.Come creare un DatetimeIndex panda con anno come frequenza?

Il documentation non menziona i valori letterali che dovrebbero essere passati, ma dopo alcuni minuti è possibile trovarne facilmente la maggior parte.

  • 's': secondo
  • 'min': minuti
  • 'H': ora
  • 'D': giorno
  • 'w': settimana
  • 'm': mese

Tuttavia, nessuno di 'y', 'Y', 'yr', ecc. crea date con anno come frequenza. Qualcuno sa cosa passare, o se è possibile a tutti?

risposta

26

indicizzazione annuale all'inizio o alla fine dell'anno

frequenza è freq='A' per fine anno di frequenza, 'AS' per inizio anno. Controlla il aliases in the documentation.

es. pd.date_range(start=pd.datetime(2000, 1, 1), periods=4, freq='A')

rendimenti

DatetimeIndex(['2000-12-31', '2001-12-31', '2002-12-31', '2003-12-31'], dtype='datetime64[ns]', freq='A-DEC', tz=None)

indicizzazione annuale al l'inizio di un mese arbitraria

Se avete bisogno di essere annuale da un momento particolare utilizzare un anchored offset, ad es.pd.date_range(start=pd.datetime(2000, 1, 1), periods=10, freq='AS-AUG')

rendimenti

DatetimeIndex(['2000-08-01', '2001-08-01', '2002-08-01', '2003-08-01'], dtype='datetime64[ns]', freq='AS-AUG', tz=None)

indicizzazione annuale da una data arbitraria

Per indice da una data arbitraria, iniziano la serie a tale data e utilizzare un costume DateOffset oggetto.

es. pd.date_range(start=pd.datetime(2000, 9, 10), periods=4, freq=pd.DateOffset(years=1))

rendimenti

DatetimeIndex(['2000-09-10', '2001-09-10', '2002-09-10', '2003-09-10'], dtype='datetime64[ns]', freq='<DateOffset: kwds={'years': 1}>', tz=None)

+2

Grazie, mi chiedo perché la pagina di documentazione di 'date_range()' non sia collegata a questa pagina, mi avrebbe risparmiata di postare questa domanda. –

+0

È possibile utilizzare un giorno personalizzato, come il 1 ° agosto? –

+0

Vedere il mio aggiornamento per quell'offset. – horatio

0

È possibile utilizzare multipli per le stringhe di frequenza. Per esempio:

pd.date_range ('01/01/2010' , periodi = 10, freq = '365 G')

Questo codice vi darà una serie con 01/01/2010, 01/01/2011, ecc., Che penso sia quello che stai cercando. Naturalmente, il problema qui è che ti imbatterai in problemi con gli anni bisestili.

+1

Ho effettivamente provato a passare in "12m" per 12 mesi, ma non è giusto, ad es. Il primo appuntamento è il 01-01-2016, il prossimo sarà il 31-01-2016. Anche i 365 non hanno ragione, gli anni bisestili. –

1

È possibile utilizzare il mese e poi scegliere ogni 12 ° mese:

months=pandas.date_range(start=datetime.datetime.now(),periods=120,freq='M') 
year=[months[11*i] for i in range(12)] 

È anche possibile fare:

usingDays=pandas.date_range(start=datetime.datetime.now(),periods=10,freq='365D') 

ma che non funziona così bene con gli anni bisestili.

+0

Per il funzionamento di cui sopra dovresti "importare datetime", ma se hai in mente una data di inizio specifica, puoi anche usarlo. – rofls

3

Con tutti quei hack, c'è un modo chiaro:

pd.date_range(start=datetime.datetime.now(),periods=5,freq='A') 

A: annualmente.

365D? Veramente? Che mi dici di leap years?

Problemi correlati