2017-04-15 3 views
3

J'ai des données saisonnières sur la neige que je veux regrouper par année de neige (du 1er juillet 1954 au 30 juin 1955) plutôt que d'avoir un hiver split données sur deux ans (1 Janvier, 1954-1931 Décembre, 1954 et le 1er Janvier, 1955-1931 déc 1955.)Les Pandas définissent une année saisonnière du 1er juin au 30 juillet au lieu du 1er janvier au 31 décembre.

example data

J'ai modifié le code de cette question:

Using pandas to select specific seasons from a dataframe whose values are over a defined threshold (merci Pad)

def get_season(row): 
    if row['date'].month <= 7: 
     return row['date'].year 
    else: 
     return row['date'].year + 1 

df['Seasonal_Year'] = df.apply(get_season, axis=1) 

results of method call

Y a-t-il une meilleure façon de faire que j'ai fait?

Répondre

3

Je pense que oui, avec numpy.where:

years = df['date'].dt.year 
df['Seasonal_Year'] = np.where(df['date'].dt.month <= 7, years, years + 1) 
3

vous pouvez utiliser pd.offsets.MonthBegin

Considérons le dataframe des dates df

df = pd.DataFrame(dict(Date=pd.date_range('2010-01-30', periods=24, freq='M'))) 

Nous pouvons compenser la date et de saisir l'année

df.assign(Season=(df.Date - pd.offsets.MonthBegin(7)).dt.year + 1) 

     Date Season 
0 2010-01-31 2010 
1 2010-02-28 2010 
2 2010-03-31 2010 
3 2010-04-30 2010 
4 2010-05-31 2010 
5 2010-06-30 2010 
6 2010-07-31 2011 
7 2010-08-31 2011 
8 2010-09-30 2011 
9 2010-10-31 2011 
10 2010-11-30 2011 
11 2010-12-31 2011 
12 2011-01-31 2011 
13 2011-02-28 2011 
14 2011-03-31 2011 
15 2011-04-30 2011 
16 2011-05-31 2011 
17 2011-06-30 2011 
18 2011-07-31 2012 
19 2011-08-31 2012 
20 2011-09-30 2012 
21 2011-10-31 2012 
22 2011-11-30 2012 
23 2011-12-31 2012