2015-10-04 31 views
0
isSpring = False 

# Calculate season e.g. spring wheat season is only ~ May - August 
if isSpring: 
    # Change from name of month to a number e.g. January is 1, December is 12 
    idx_srt_mon = strptime('May', '%B').tm_mon 
    idx_end_mon = strptime('September', '%B').tm_mon 
else: 
    idx_srt_mon = strptime('September', '%B').tm_mon 
    idx_end_mon = strptime('August', '%B').tm_mon 

# Assign seasons, works for crops with season within 1 year and also winter crops with seasons spanning years 
df['Season'] = numpy.nan 
first_yr  = df.YEAR.unique()[0] 
for i, row in df.iterrows(): 
    cur_month = row.MONTH 
    cur_yr = row.YEAR 

    if cur_month < idx_srt_mon: 
     if not isSpring and (cur_month < idx_end_mon): 
      if cur_yr > first_yr: 
       df.set_value(i, 'Season', cur_yr - 1) 
    else: 
     if cur_month <= idx_end_mon or not isSpring: 
      df.set_value(i, 'Season', cur_yr) 

在數據幀的計算:https://www.dropbox.com/s/gwyim6kc83mw3yf/df.csv?dl=0,我想補充一個新的列,其如下分配一個「賽季」:加快熊貓iterrows可以在這裏四季

  1. 如果isSpring爲TRUE,那麼當前一年季從idx_srt_mon分配給所有行idx_end_mon(五月至九月)

  2. 如果isSpring爲FALSE,那麼本賽季開始在當年九月,去高達明年八月。在整個2年的整個時期內,本賽季是它開始的一年。例如,如果開始是2000年9月,那麼賽季將會從2000年的2000年9月2001年8月

  3. 對於所有其他情況,季節numpy.nan

我已經使用df.iterrows做這個計算,但它很慢。我如何加快速度?

回答

1

您需要仔細檢查邏輯,但是可以通過構建正確的布爾條件來進行矢量化,如下所示。

In [20]: first_yr = df.YEAR.min() 

In [21]: if isSpring: 
    ...:  df.loc[df['MONTH'] <= 9, 'Season'] = df.YEAR 
    ...: else: 
    ...:  df['Season'] = np.where(
       (df['MONTH'] < 8) & (df['YEAR'] > first_yr), 
        df['YEAR'] - 1, 
        np.where(df['MONTH'] <= 8, df['YEAR'], 
               np.nan)) 
+0

很好,ty。再也不要使用它! – user308827