Dopo aver combattuto con NumPy e dateutil per giorni, ho scoperto di recente la straordinaria libreria Pandas. Ho esaminato la documentazione e il codice sorgente, ma non riesco a capire come ottenere date_range()
per generare indici ai punti di interruzione giusti.Intervalli di date in Pandas
from datetime import date
import pandas as pd
start = date('2012-01-15')
end = date('2012-09-20')
# 'M' is month-end, instead I need same-day-of-month
date_range(start, end, freq='M')
quello che voglio:
2012-01-15
2012-02-15
2012-03-15
...
2012-09-15
cosa ottengo:
2012-01-31
2012-02-29
2012-03-31
...
2012-08-31
Ho bisogno pezzi al mese dimensioni che rappresentano il numero variabile di giorni in un mese. Questo è possibile con dateutil.rrule:
rrule(freq=MONTHLY, dtstart=start, bymonthday=(start.day, -1), bysetpos=1)
Brutto e illeggibile, ma funziona. Come posso fare questo con i Panda? Ho giocato con entrambi date_range()
e period_range()
, finora senza fortuna.
Il mio obiettivo attuale è quello di utilizzare groupby
, crosstab
e/o resample
per calcolare i valori per ogni periodo sulla base di somme/mezzo/etc di voci individuali all'interno del periodo. In altre parole, voglio trasformare i dati da:
total
2012-01-10 00:01 50
2012-01-15 01:01 55
2012-03-11 00:01 60
2012-04-28 00:01 80
#Hypothetical usage
dataframe.resample('total', how='sum', freq='M', start='2012-01-09', end='2012-04-15')
a
total
2012-01-09 105 # Values summed
2012-02-09 0 # Missing from dataframe
2012-03-09 60
2012-04-09 0 # Data past end date, not counted
Dato che Panda è nato come uno strumento di analisi finanziaria, ne sono praticamente certo che c'è un modo semplice e veloce per fare Questo. Aiuto apprezzato!
Grazie, questo può essere il trucco ho bisogno di creare una soluzione basata su l'hack RRULE. Tuttavia, questo non aiuta il ricampionamento su un intervallo, poiché resample utilizzerà ancora i bin allineati all'inizio del mese AFAIK. – knite
Se avete intenzione di passare da un numero consistente di giorni, è più sensato utilizzare l'inizio mese "MS": 'pd.date_range (start, end, freq = 'MS'). Shift (15, freq = pd. datetools.day) ' –