最近我得到了一个csv文件,其中包含我们公司在不同市场/工具上进行的交易。我的数据集包含超过50万行。
这是我的数据样本,没有(此时)不相关的列:
Market Price Quantity
Time
2019-01-01 09:42:16 Share 180.00 5.0
2019-01-01 09:44:59 Share 180.00 10.0
2019-01-01 09:46:24 Share 180.00 6.0
2019-01-01 09:47:21 Share 180.00 5.0
2019-01-01 09:52:19 Share 180.00 10.0
2019-01-01 09:52:19 Share 180.00 5.0
2019-01-01 09:52:19 Share 180.00 5.0
2019-01-01 09:57:37 Share 180.01 10.0
2019-01-02 10:03:43 Share 235.00 10.0
2019-01-02 10:04:11 Share 235.00 10.0
2019-01-02 10:04:19 Share 235.00 10.0
... ... ... ...
2019-05-13 10:06:44 Share 233.00 10.0
2019-05-13 10:11:45 Share 233.00 10.0
2019-05-13 10:11:45 Share 233.00 10.0
2019-05-13 10:11:49 Share 234.00 10.0
2019-05-13 10:11:49 Share 234.00 10.0
2019-05-13 10:11:54 Share 233.00 10.0
2019-05-14 09:50:56 Share 230.00 10.0
2019-05-14 09:53:31 Share 229.00 10.0
2019-05-14 09:53:55 Share 229.00 5.0
2019-05-14 09:53:59 Share 229.00 3.0
2019-05-14 09:54:01 Share 229.00 2.0
2019-05-14 09:54:07 Share 229.00 3.0
2019-05-14 09:54:16 Share 229.00 2.0
我已经将“时间”列转换为熊猫日期时间。
尽管我能够获得一些所需的统计信息,但我却无法确定每天的第一笔和最后一笔交易的时间。
Expected OUTPUT:
2019-03-12 08:43:23 Share(name) 248 10
2019-03-12 16:48:21 Share(name) 250 20
好吧,我在Excel中获得此功能没有问题,但是考虑到快速增长的数据量,我宁愿使用pandas和python来实现此目的。
我假设可以使用groupby和resample方法的某种组合来解决问题,但是我不知道如何将它们正确地应用于数据框。
任何想法和评论都会受到赞赏。
感谢 Ben Pap ,我使用以下方法获得了结果:
dbs.groupby(dbs.index.date).apply(lambda x: x.iloc[np.r_[0:1,-1:0]])
这是我提出的另一个问题。我想使用什么函数来获得第一次交易时间的最大值。那么换句话说,哪一天的交易最晚开始?
答案 0 :(得分:2)
df.groupby(df['Time'].dt.day).apply(lambda x: x.iloc[np.r_[0:1, -1:0]])
只要订购日期,这将为您提供每天的第一天和最后一天。
答案 1 :(得分:1)
groupby
后跟apply
new_df = (df.groupby(df.index.floor('D'))
.apply(lambda x: x.iloc[[0,-1]])
.reset_index(level=0, drop=True)
)
new_df
groupby
,后跟agg
和stack
new_df = (df.reset_index().groupby(df.index.floor('D'))
.agg(['first','last'])
.stack(level=1)
.reset_index(drop=True)
.set_index('Time')
)
输出:
Market Price Quantity
Time
2019-01-01 09:42:16 Share 180.00 5.0
2019-01-01 09:57:37 Share 180.01 10.0
2019-01-02 10:03:43 Share 235.00 10.0
2019-01-02 10:04:19 Share 235.00 10.0
2019-05-13 10:06:44 Share 233.00 10.0
2019-05-13 10:11:54 Share 233.00 10.0
2019-05-14 09:50:56 Share 230.00 10.0
2019-05-14 09:54:16 Share 229.00 2.0
在任何情况下,如果有几天只有交易,您可能要事后drop_duplicates
。
答案 2 :(得分:1)
如果您使用日期时间格式的索引,则可以使用方法resample()
:
df['Datetime'] = df.index
df.resample('D').agg(['first', 'last']).stack().set_index('Datetime')
结果:
Market Price Quantity
Datetime
2019-01-01 09:42:16 Share 180.00 5.0
2019-01-01 09:57:37 Share 180.01 10.0
2019-01-02 10:03:43 Share 235.00 10.0
2019-01-02 10:04:19 Share 235.00 10.0