如何对每个时间戳进行重新采样和舍入到最近的秒数?

3

我的数据长这样(数据类型为Pandas DataFrame):

price = 

time                bid
03:03:34.797000     116.02
03:03:34.797000     116.02
03:03:54.152000     116.02
03:03:54.169000     116.02
03:03:54.169000     116.02
03:07:36.899000     116.24
03:07:48.760000     116.24
03:07:48.760000     116.24
03:07:48.761000     116.24

我尝试将数据重新采样为每秒级别的数据,并将每个数据对齐到原始时间之后最近的一秒。我希望结果是:

03:04:00    116.02
03:05:00    NaN
03:06:00    NaN
03:07:00    NaN
03:08:00    116.24

并且使用

price.resample('Min').last()

然而,我得到了。
03:03:34.797000     116.02
03:04:34.797000     NaN
03:05:34.797000     NaN
03:06:34.797000     NaN
03:07:34.797000     116.24

除对齐外,一切都很顺利。有人可以帮我解决这个问题吗?谢谢。

3个回答

1
(df.groupby(df['time'].dt.round('1min') )['bid'].mean()).asfreq('Min')
Out[45]: 
time
2017-12-06 03:04:00    116.02
2017-12-06 03:05:00       NaN
2017-12-06 03:06:00       NaN
2017-12-06 03:07:00       NaN
2017-12-06 03:08:00    116.24
Freq: T, Name: bid, dtype: float64

1
我尝试了这个解决方案,它运行得更快。
df = df.resample('Min').last()
offset_mc = df.index[0].microseconds
offset_sec = df.index[0].seconds % 60
if not (offset_mc == 0 and offset_sec == 0): df.index +=  pd.tslib.Timedelta(str(59-offset_sec)+'seconds '+str(1000000-offset_mc)+'microseconds')

1
您需要使用 floor:

df.groupby(df.index.floor('Min')).last().resample('Min').asfreq()

让我们尝试提高速度(需要Pandas 0.21.0或更高版本):

df.set_axis(df.index.floor('Min'), axis=0, inplace=False)\
  .drop_duplicates().resample('Min').asfreq()

输出:

             bid
time            
03:03:00  116.02
03:04:00     NaN
03:05:00     NaN
03:06:00     NaN
03:07:00  116.24

谢谢。但是按组分组可能会很慢,对吧?我需要运行大约500M行,有没有更快的方法来做到这一点? - MTANG
@MTANG,我增加了另一种解决方案,它不使用groupby,并且对于这个小数据集我看到了一些速度上的改善。 - Scott Boston
然而,我发现如果我手动添加偏移量来将索引对齐到最近的分钟,它会变得更快。 - MTANG
@MTANG,你能发一下你的解决方案吗?这是SO社区从你的情况中学习的好地方。谢谢。 - Scott Boston
@MTANG 如果这个答案对您有帮助,您是否考虑接受它呢?谢谢。 - Scott Boston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接