不得不承认这对我来说是一个很棒的时刻:我花了这么多时间阅读论坛后,终于在stackoverflow中发布了一个问题。
拥有csv文件,其中包含一天内完成的交易订单列表,有时在1秒内超过100行
data1
>CO1 Comdty A B C D
>2017-08-10 00:00:00 TRADE 52.70 1 NaN
>2017-08-10 00:00:00 TRADE 52.70 1 NaN
>2017-08-10 00:00:00 TRADE 52.70 1 NaN
>2017-08-10 00:00:00 TRADE 52.84 1 NaN
........................
>2017-08-10 00:00:02 TRADE 52.90 1 NaN
>2017-08-10 00:00:02 TRADE 52.92 1 NaN
Index是一个Datetime对象,如下所示:
DatetimeIndex(['2017-08-10 00:00:00', '2017-08-10 00:00:00',
'2017-08-10 00:00:00', '2017-08-10 00:00:00',
'2017-08-10 00:00:00', '2017-08-10 00:00:00',
'2017-08-10 00:00:00', '2017-08-10 00:00:00',
'2017-08-10 00:00:00', '2017-08-10 00:00:00',
...
'2017-08-21 23:58:00', '2017-08-21 23:58:00',
'2017-08-21 23:58:00', '2017-08-21 23:58:00',
'2017-08-21 23:58:00', '2017-08-21 23:58:00',
'2017-08-21 23:58:00', '2017-08-21 23:58:00',
'2017-08-21 23:58:00', '2017-08-21 23:58:00'],
dtype='datetime64[ns]', name=u'CO1 Comdty', length=1005276, freq=None)
我使用groupby函数来获取每秒的均值
dataG1 = data1.groupby([data1.index.month,data1.index.day,data1.index.hour,data1.index.minute,data1.index.second])['B'].mean()
结果是给我一个MultiIndex系列,按分钟在第二个0分组
8 10 0 0 0 52.702941
1 0 52.700000
2 0 52.704333
3 0 52.690000
4 0 52.689691
5 0 52.690000
7 0 52.700000
8 0 52.700000
9 0 52.704444
10 0 52.710652
....................
因此,您可以看到每分钟(和第二个0)给出了最后一列价格,我希望平均每秒! (列为月/日/小时/分钟/秒)
当我尝试按月,日,小时和分钟分组时,它正确计算。
无法在任何地方找到解决方案,有人可以帮忙吗?
谢谢!
回答Parfait的评论:
+++++++++++++++++++++++++++++++++++++++++++++++ ++++
是的,您可以通过以下链接下载csv文件:
data1 = pd.read_csv('data1.csv',sep=',', parse_dates=[0], index_col=0,infer_datetime_format=True)
dataG1 = data1.groupby([data1.index.month,data1.index.day,data1.index.hour, data1.index.minute,data1.index.second])['B'].mean()
dataG1
然后你会看到相同的结果。
又来了!
答案 0 :(得分:0)
我下载了CSV文件,但它似乎不在您的数据中:
CO1 Comdty A B C D
08-10-17 00:00 TRADE 52.7 1
08-10-17 00:00 TRADE 52.7 1
08-10-17 00:00 TRADE 52.7 1
08-10-17 00:00 TRADE 52.7 1
...
08-10-17 00:01 TRADE 52.7 1
08-10-17 00:01 TRADE 52.7 1
08-10-17 00:01 TRADE 52.7 1
如果您真的想要按秒分组,则必须重新索引数据。但是,要小心,因为你似乎每分钟都没有相同数量的样本,所以我假设你有一个任意的间隔给你下一个样本。
这就是你的重建索引的样子:
import pandas as pd
import numpy as np
data1 = pd.DataFrame.from_csv('data1.csv')
data_end = data1[::-1].index[0] + pd.Timedelta(minutes=1)
tmp = data1.groupby(data1.index.minute)['B'].count()
tmp = tmp.append(pd.DataFrame([0], index=[data_end.minute]))[0]
indices = list()
start = data1.index[0]
for s, e in zip(tmp[:len(tmp)-1].iteritems(), tmp[1:].iteritems()):
smin, sint = s
emin, eint = e
start = data1.index[0] + pd.Timedelta(minutes=smin)
end = data1.index[0] + pd.Timedelta(minutes=emin)
indices.append( pd.to_datetime(np.linspace(start.value, end.value, sint)) )
start = end
data1.index = np.hstack(indices)
这将简单地重新索引所有样本,通过每分钟平均分配它们。然而,这是一个很大的假设,您必须知道这是否有效。
8 10 0 0 0 52.700
1 52.700
3 52.700
5 52.700
7 52.700
9 52.700
10 52.700
12 52.700
14 52.710
16 52.710
18 52.700
20 52.710
...
答案 1 :(得分:0)
感谢您的帮助,对我来说这不是一个方便的解决方案,因为我每分钟都会有不同的样本量。另外,我需要准确的第二个平均价格。
我意识到csv文件中缺少信息;因为当我将数据粘贴为" datetime"从excel到csv,它丢失了索引的小数部分,其中包括秒,毫秒等。
通过将值粘贴为浮点值找到解决方案,然后使用以下转换将其转换为datetime:
import pandas as pd
import numpy as np
data1 = pd.DataFrame.from_csv('data1.csv')
data1.index = pd.to_datetime(1000000000*86400*(data1.index-25569))
dataG1 = data1.groupby([data1.index.month,data1.index.day,data1.index.hour,
data1.index.minute,data1.index.second])['B'].mean()
dataG1 = dataG1.reset_index()
dataG1
8 10 0 0 0 52.701818
1 52.710000
8 52.700000
10 52.700000
13 52.703889
59 52.700000
1 59 52.700000
2 5 52.708462
7 52.710000
15 52.700000
.............................
我的平均价格略有不同......例如,第一行是8/10/0/0,第二行是平均值52.701818而不是52.70231
我也不相信我的解决方案,我希望你的例子有相同的间隔,并在缺少时保持相同的值。很想知道你是否有更好的想法。
很多人!