diff --git a/aosstower/level_b1/nc.py b/aosstower/level_b1/nc.py index 60f4e9b286fda9f14c464d6525ec95777d0d319a..ad3952979e1020f2d47df9d2e66fecba552e50b2 100644 --- a/aosstower/level_b1/nc.py +++ b/aosstower/level_b1/nc.py @@ -207,7 +207,7 @@ def calculate_wind_gust(wind_speed_5s, wind_speed_2m): """ # 1 minute rolling peaks - wind_peak_1m = wind_speed_5s.rolling(window=12, center=False).max() + wind_peak_1m = wind_speed_5s.rolling(window='1T', center=False).max() # criteria for a fast wind to be considered a wind gust gust_mask = (wind_speed_2m >= KNOTS_9) & \ (wind_peak_1m >= wind_speed_2m + KNOTS_5) @@ -215,9 +215,9 @@ def calculate_wind_gust(wind_speed_5s, wind_speed_2m): # determine highest gust in the last 10 minutes # 5 seconds * 120 = 10 minutes - max_10m_gusts = gusts.rolling(window=120, center=False).max() + max_10m_gusts = gusts.rolling(window='10T', center=False).max() # Minimum 5-second average in the past 10 minutes - min_10m_5avg = wind_speed_5s.rolling(window=120, center=False).min() + min_10m_5avg = wind_speed_5s.rolling(window='10T', center=False).min() # criteria for a wind gust to be reportable reportable_mask = (max_10m_gusts >= wind_speed_2m + KNOTS_3) & \ (wind_speed_2m > KNOTS_2) & \ @@ -264,7 +264,7 @@ def summary_over_interval(frame, interval_width): # the value at time X is for the data X - interval_width minutes exclude = ['gust', 'wind_east', 'wind_north'] include = [c for c in frame.columns if c not in exclude] - gb = frame[include].resample(interval_width, closed='right', loffset=interval_width) + gb = frame[include].resample(interval_width, closed='left') low = gb.min() low.rename(columns=lambda x: x + "_min", inplace=True) @@ -276,8 +276,8 @@ def summary_over_interval(frame, interval_width): out_frames = pd.concat((low, high, mean), axis=1) # wind fields need to be handled specially - ws_min_idx = frame['wind_speed'].resample(interval_width, closed='right', loffset=interval_width).apply(lambda arr_like: arr_like.argmin()) - ws_max_idx = frame['wind_speed'].resample(interval_width, closed='right', loffset=interval_width).apply(lambda arr_like: arr_like.argmax()) + ws_min_idx = frame['wind_speed'].resample(interval_width, closed='left').apply(lambda arr_like: arr_like.argmin()) + ws_max_idx = frame['wind_speed'].resample(interval_width, closed='left').apply(lambda arr_like: arr_like.argmax()) # probably redundant but need to make sure the direction indexes are # the same as those used in the wind speed values # must use .values so we don't take data at out_frames index, but rather @@ -286,11 +286,11 @@ def summary_over_interval(frame, interval_width): out_frames['wind_speed_max'] = frame['wind_speed'][ws_max_idx].values out_frames['wind_speed_min_dir'] = calc.wind_vector_degrees(frame['wind_east'][ws_min_idx], frame['wind_north'][ws_min_idx]).values out_frames['wind_speed_max_dir'] = calc.wind_vector_degrees(frame['wind_east'][ws_max_idx], frame['wind_north'][ws_max_idx]).values - we = frame['wind_east'].resample(interval_width, closed='right', loffset=interval_width).mean() - wn = frame['wind_north'].resample(interval_width, closed='right', loffset=interval_width).mean() + we = frame['wind_east'].resample(interval_width, closed='left').mean() + wn = frame['wind_north'].resample(interval_width, closed='left').mean() out_frames['wind_speed_mean_dir'] = calc.wind_vector_degrees(we, wn).values - gust_idx = frame['gust'].resample(interval_width, closed='right', loffset=interval_width).apply(lambda arr_like: arr_like.argmax()) + gust_idx = frame['gust'].resample(interval_width, closed='left').apply(lambda arr_like: arr_like.argmax()) # gusts may be NaN so this argmax will be NaN indexes which don't work great gust_idx = gust_idx.astype('datetime64[ns]', copy=False) peak_gust = frame['gust'][gust_idx] @@ -397,13 +397,11 @@ def create_giant_netcdf(input_files, output_fn, zlib, chunk_size, frame['wind_east'], frame['wind_north'], _ = calc.wind_vector_components(frame['wind_speed'], frame['wind_dir']) # round up each 1 minute group so data at time T is the average of data # from T - 1 (exclusive) to T (inclusive). - # new_frame = frame.resample('1T', closed='right', loffset='1T').mean() new_frame = frame.resample('5S', closed='right', loffset='5S').mean() # 2 minute rolling average of 5 second data (5 seconds * 24 = 120 seconds = 2 minutes) winds_frame_5s = new_frame[['wind_speed', 'wind_east', 'wind_north']] - # winds_frame_5s = winds_frame_5s.resample('5S', closed='right', loffset='5S').mean() - winds_frame_2m = winds_frame_5s.rolling(24, win_type='boxcar').mean() + winds_frame_2m = winds_frame_5s.rolling('2T').mean() winds_frame_2m['gust'] = calculate_wind_gust(winds_frame_5s['wind_speed'], winds_frame_2m['wind_speed']) # rolling average is used for mean output @@ -415,9 +413,6 @@ def create_giant_netcdf(input_files, output_fn, zlib, chunk_size, frame = summary_over_interval(new_frame, interval_width) else: frame = new_frame.resample(interval_width, closed='right', loffset=interval_width).mean() - # gust_idx = new_frame['gust'].resample(interval_width, closed='right', loffset=interval_width).apply(lambda arr_like: arr_like.argmax()) - # frame['gust'][:] = new_frame['gust'][gust_idx.values] - # frame['wind_dir'] = calc.wind_vector_degrees(frame['wind_east'][gust_idx.values], frame['wind_north'][gust_idx.values]) frame['wind_dir'] = calc.wind_vector_degrees(frame['wind_east'], frame['wind_north']) frame['gust'] = new_frame['gust'].resample(interval_width, closed='right', loffset=interval_width).max() frame.fillna(np.nan, inplace=True)