将逐笔数据转换为日数据
我想把一个包含交易数据的csv文件转换成每天的价格和交易量。这个csv文件的格式是:unix时间戳、价格、交易量。
我用groupby函数只能按unix秒来分组。有没有什么好的方法可以得到每天的收盘价格和每天的交易量总和呢?
我在用python 2.7,并且已经安装了pandas库,但对它还不是很熟悉。
其实,我目前能做到的最多就是这个:
import pandas as pd
data = pd.read_csv('file.csv',names=['unix','price','vol'])
datagr = data.groupby('unix')
dataPrice = datagr['price'].last()
dataVol = datagr['vol'].sum()
示例数据:
1391067323,772.000000000000,0.020200000000
1391067323,772.000000000000,0.020000000000
1391067323,771.379000000000,1.389480000000
1391067323,772.000000000000,1.244540000000
1391067326,774.955000000000,0.084830600000
1391067326,774.955000000000,0.084833400000
1391067327,774.955000000000,0.084830600000
1391067331,774.953000000000,0.200000000000
1391067336,774.951000000000,0.101202000000
这个方法能获取每个unix秒的最后价格,并计算在这个unix秒内发生的交易量总和。问题是它是按unix秒来分组的,我不想用什么特别复杂的方法,因为时间有限。
1 个回答
3
你可以使用 to_datetime
把 Unix 时间转换成 pandas 的日期时间格式:
df['unix'] = pd.to_datetime(df['unix'], unit='s')
现在你可以把这个设置为索引,然后使用 重采样:
df = df.set_index('unix')
df.resample('D', how={'volume': 'sum', 'price': 'last'})
注意:我们对不同的列使用了不同的方法。
示例:
In [11]: df = pd.DataFrame(np.random.randn(5, 2), pd.date_range('2014-01-01', periods=5, freq='H'), columns=list('AB'))
In [12]: df
Out[12]:
A B
2014-01-01 00:00:00 -1.185459 -0.854037
2014-01-01 01:00:00 -1.232376 -0.817346
2014-01-01 02:00:00 0.478683 -0.467169
2014-01-01 03:00:00 -0.407009 0.290612
2014-01-01 04:00:00 0.181207 -0.171356
In [13]: df.resample('D', how={'A': 'sum', 'B': 'last'})
Out[13]:
A B
2014-01-01 -2.164955 -0.171356