2017-05-01 13 views
0

30分のデータを毎時のデータにリサンプリングしていますが、24時間にわたって30分の期間をすべて表すNaNの行を追加しています。 30分の記録にデータがある場合にのみ再サンプリングしたいと思います。元のdfには20日以上の9:30-4:00の「余分な」行と時間単位のデータはありません。また、新しいdf_RSHourlyの週末も含まれています。パンダOHLCの日中データを定期的な取引時間外にリサンプリングする

df_RSHourly = df.resample('1H', base=0.5).agg(
    {'close': 'last','high': 'max','low': 'min', 'open': 'first', 'volume': 'sum'} 
] 

print df_RSHhourly 

2017-04-25 09:30:00-04:00 238.75 238.52 237.91 237.81 151998.0 
2017-04-25 10:30:00-04:00 238.62 238.44 238.53 238.33 64281.0 
2017-04-25 11:30:00-04:00 238.66 238.56 238.44 238.36 58319.0 
2017-04-25 12:30:00-04:00 238.71 238.59 238.56 238.29 47994.0 
2017-04-25 13:30:00-04:00 238.82 238.69 238.59 238.52 58266.0 
2017-04-25 14:30:00-04:00 238.95 238.84 238.69 238.57 73089.0 
2017-04-25 15:30:00-04:00 238.83 238.53 238.83 238.53 103572.0 
2017-04-25 16:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-25 17:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-25 18:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-25 19:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-25 20:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-25 21:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-25 22:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-25 23:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-26 00:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-26 01:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-26 02:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-26 03:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-26 04:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-26 05:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-26 06:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-26 07:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-26 08:30:00-04:00  NaN  NaN  NaN  NaN  NaN 
2017-04-26 09:30:00-04:00 238.91 238.87 238.53 238.50 91978.0 
2017-04-26 10:30:00-04:00 239.53 239.47 238.88 238.85 75444.0 
2017-04-26 11:30:00-04:00 239.48 239.02 239.48 238.70 88402.0 
2017-04-26 12:30:00-04:00 239.42 239.20 239.02 238.98 45661.0 
+0

私はあなただけ 'dropnaを使用することができると思います'...' df_RSHhourly.dropna() ' – piRSquared

+0

dfが作成された後にそれを行うと、正しく再サンプリングされるとは思われません。それは? 4時から9時30分までのデータは正確な時間バーを再構築するために再サンプリングされないため、それが可能であれば、NaNの行の値を作成せずに再サンプリングして開始します。 。 –

答えて

0

私は私が最初で、それを解決し

に単純だが、非効率的な方法

それを解決するための2つの方法を発見し、数分のリサンプリングと同様の問題を持っていました日付/時刻を含める必要があるかどうかをチェックするユーティリティ列を追加してから、条件が真であるスライスを取得します。

def in_hours(row): 
    if row.name.hour >= 22 
     or row.name.hour < 9 
     or row.name.hour == 9 and row.name.minute < 30: 
     return False 
    return True 

df['keep'] = df.apply(in_hours, axis=1) 
df2 = dft[dft['keep']==True] 
del dft['keep'] 

リサンプルでは多くの無駄なデータが生成されて後で破棄される可能性があるため、特に賢明で効率的ではありませんが、スマートな方法は見つけられませんでした。 市場が早期に閉鎖される場合は、「in_hours」に追加のロジックが必要です。私は毎日のスライスを取る

、より信頼性の高い方法

毎日境界の間リサンプリングして、日々のデータフレームを連結、それはより多くのメモリと計算集約的であるが、より信頼性の高い

#create a colume with the day for grouping by 
df['day'] = df.index 
#group by day and get the max time, ie time of the last data of the day 
df2 = df.day.groupby(pd.TimeGrouper('D')).max() 
resampled_df_list = [] 

#for each day resample 
for max_time in df2: 
    if type(max_time) is pd.tslib.Timestamp: # will be NaT on WE 
     end_time = max_time 
     start_time = datetime(max_time.year, max_time.month, 
max_time.day, 0, 0) 
     df1d = df.loc[start_time:end_time].resample('1min').mean() 
     resampled_df_list.append(df1d) 

#put it back together 
new_df = pd.concat(resampled_df_list) 
+0

データに隙間がある場合(つまり、液体でないセキュリティの場合は30分、おそらくは1時間の取引なし) – MattClimbs

関連する問題