每个第n行重新采样pandas DataFrame,每列有不同的参数?

时间:2017-01-06 23:59:34

标签: python pandas dataframe resampling

我通过col_headings Date,Time,Open,High,Low,Close,Volume获得了一分钟一分钟的库存数据。我需要对每个第n行(在本例中每隔3行)重新采样,但在几列上使用不同的参数。我到目前为止的代码是:

import pandas as pd
import numpy as np

spy = pd.read_csv("C:\\Users\\PC\\Desktop\\spy_test.csv")

#Sample for every n minutes
n = 3
b = n-1


spy_date = pd.DataFrame(spy['Date'])
date = spy_date.iloc[b::n, :]

spy_time = pd.DataFrame(spy['Time'])
time = spy_time.iloc[b::n, :]
time = time.reset_index(drop=True)
spy_open = pd.DataFrame(spy['Open'])
open = spy_open.iloc[::n, :]
open = open.reset_index(drop=True)

spy_high = pd.DataFrame(spy['High'])
high_s = spy_high.iloc[::n, :].max()
high = pd.DataFrame(high_s)
high = high.reset_index(drop=True)

spy_low = pd.DataFrame(spy['Low'])
low_s = spy_low.iloc[::n, :].min()
low = pd.DataFrame(low_s)
low = low.reset_index(drop=True)

spy_close = pd.DataFrame(spy['Close'])
close = spy_close.iloc[::n, :]
close = close.reset_index(drop=True)

spy_volume = pd.DataFrame(spy['Volume'])
volume_s = spy_volume.iloc[n::3, :].sum()
volume = pd.DataFrame(volume_s)
volume = volume.reset_index(drop=True)

joined = [date, time, open, high, low, close, volume]

result = pd.concat(joined, axis=1)
result.columns = ['Date', 'Time', 'Open', 'High', 'Low', 'Close', 'Volume']

print(result)

此代码有效,但High,Low和Volume列仅返回单个值。在我想要每个3分钟块的最大/最小/总和的地方,它返回整个列的高/低/总和。

另外,如果你知道一个更简单的方法,初学者会或多或少地理解这一点,我很满意。我只编了几个星期,所以我真的不知道自己在做什么。

注意:我考虑使用qcut但据我所知,我需要弄清楚我想要提前多少个箱子。由于我将通过相同的基本格式运行不同的数据集,因此它似乎不太理想。

1 个答案:

答案 0 :(得分:1)

由于您有军事时间,因此首先将其转换为timedelta。由于你有整数,你可能还需要添加前导零。我用zfill完成了这个。

df['Time'] = pd.to_timedelta(pd.to_datetime(df.Time.map(lambda x: str(x).zfill(4)),format='%H%M').dt.time.astype(str))
df.set_index('Time').groupby(['Date', pd.Timegrouper('3T')]).agg({'Open':'last', 'High':'max', 'Low':'min', 'Close':'last','Volume':'sum'})