Ci sono diversi modi per farlo.
- Ho creato il riquadro dati per mostrare le diverse tecniche per filtrare i dati.
df = pd.DataFrame({'Date':['01-Jun-13','03-Jun-13', '15-Aug-13', '20-Jan-14', '21-Feb-14'],
'abc': [100, -20,40,25,60], 'xyz': [200,50, -5,15,80]})
- I mesi separati/anno/giorno e mese-anno separato come hai spiegato.
def getMonth(s):
return s.split("-")[1]
def getDay(s):
return s.split("-")[0]
def getYear(s):
return s.split("-")[2]
def getYearMonth(s):
return s.split("-")[1]+"-"+s.split("-")[2]
- ho creato nuove colonne:
year
, month
, day
e 'yearMonth
'. Nel tuo caso, hai bisogno di entrambi. Si gruppo utilizzando due colonne 'year','month'
o possibile utilizzando una colonna yearMonth
df['year']= df['Date'].apply(lambda x: getYear(x))
df['month']= df['Date'].apply(lambda x: getMonth(x))
df['day']= df['Date'].apply(lambda x: getDay(x))
df['YearMonth']= df['Date'].apply(lambda x: getYearMonth(x))
uscita:
Date abc xyz year month day YearMonth
0 01-Jun-13 100 200 13 Jun 01 Jun-13
1 03-Jun-13 -20 50 13 Jun 03 Jun-13
2 15-Aug-13 40 -5 13 Aug 15 Aug-13
3 20-Jan-14 25 15 14 Jan 20 Jan-14
4 21-Feb-14 60 80 14 Feb 21 Feb-14
- Si può passare attraverso i diversi gruppi in groupby (..) articoli .
In questo caso, ci si raggruppano da due colonne:
for key,g in df.groupby(['year','month']):
print key,g
uscita:
('13', 'Jun') Date abc xyz year month day YearMonth
0 01-Jun-13 100 200 13 Jun 01 Jun-13
1 03-Jun-13 -20 50 13 Jun 03 Jun-13
('13', 'Aug') Date abc xyz year month day YearMonth
2 15-Aug-13 40 -5 13 Aug 15 Aug-13
('14', 'Jan') Date abc xyz year month day YearMonth
3 20-Jan-14 25 15 14 Jan 20 Jan-14
('14', 'Feb') Date abc xyz year month day YearMonth
In questo caso, ci si raggruppano da una colonna:
for key,g in df.groupby(['YearMonth']):
print key,g
uscita:.
Jun-13 Date abc xyz year month day YearMonth
0 01-Jun-13 100 200 13 Jun 01 Jun-13
1 03-Jun-13 -20 50 13 Jun 03 Jun-13
Aug-13 Date abc xyz year month day YearMonth
2 15-Aug-13 40 -5 13 Aug 15 Aug-13
Jan-14 Date abc xyz year month day YearMonth
3 20-Jan-14 25 15 14 Jan 20 Jan-14
Feb-14 Date abc xyz year month day YearMonth
4 21-Feb-14 60 80 14 Feb 21 Feb-14
- Nel caso in cui l'accesso alla voglia elemento specifico, è possibile utilizzare
get_group
df.groupby di stampa ([ 'annoMese']) get_group ('Jun-13')
Uscita:
Date abc xyz year month day YearMonth
0 01-Jun-13 100 200 13 Jun 01 Jun-13
1 03-Jun-13 -20 50 13 Jun 03 Jun-13
- Simile a
get_group
. Questo hack potrebbe aiutare a filtrare i valori e ottenere i valori raggruppati.
Anche questo darebbe lo stesso risultato.
print df[df['YearMonth']=='Jun-13']
uscita:
Date abc xyz year month day YearMonth
0 01-Jun-13 100 200 13 Jun 01 Jun-13
1 03-Jun-13 -20 50 13 Jun 03 Jun-13
È possibile selezionare l'elenco dei abc
o xyz
valori durante Jun-13
print df[df['YearMonth']=='Jun-13'].abc.values
print df[df['YearMonth']=='Jun-13'].xyz.values
uscita:
[100 -20] #abc values
[200 50] #xyz values
Puoi usare questo per passare attraverso le date che hai classificato come "year-month" e applicare cretiria su di esso per ottenere dati correlati.
for x in set(df.YearMonth):
print df[df['YearMonth']==x].abc.values
print df[df['YearMonth']==x].xyz.values
Consiglio anche controllare questo answer pure.
Grazie per l'aiuto. Non riuscivo a far funzionare TimeGrouper, ma resample ("M") ha fatto il trucco. Comunque solo fyi, richiedeva l'argomento how = 'sum'. Il mio unico problema ora è che la trama sta usando il pieno datetime per le etichette tick. Ho bisogno di mostrare solo il mese e l'anno per ogni barra. Grazie ancora. – darkpool