熊猫重新采样:强制时间条的特定开始时间

时间:2018-12-05 15:23:24

标签: python pandas dataframe resampling

我有一些时间序列datapandas.DataFrame),我在'600S'条中对其进行了重新采样:

import numpy as np
data.resample('600S', level='time').aggregate({'abc':np.sum})

我得到这样的东西:

                   abc
time                
09:30:01.446000  19836
09:40:01.446000   8577
09:50:01.446000  29746
10:00:01.446000  29340
10:10:01.446000   5197
...

如何强制时间条从09:30:00.000000开始而不是从数据的第一行开始?即输出应该是这样的:

                   abc
time                
09:30:00.000000  *****
09:40:00.000000   ****
09:50:00.000000  *****
10:00:00.000000  *****
10:10:00.000000   ****
...

谢谢您的帮助!

3 个答案:

答案 0 :(得分:4)

您可以将Series.dt.floor添加到您的代码中:

df.time = df.time.dt.floor('10 min')

              time    abc
0 2018-12-05 09:30:00  19836
1 2018-12-05 09:40:00   8577
2 2018-12-05 09:50:00  29746
3 2018-12-05 10:00:00  29340
4 2018-12-05 10:10:00   5197

答案 1 :(得分:1)

.resample有点通配符。它在datetime64[ns]timedelta64[ns]上的行为大不相同,因此我个人发现,在做groupby.sum之类的事情时,与.first一起工作更可靠。 / p>

样本数据

import pandas as pd
import numpy as np

n = 1000
np.random.seed(123)
df = pd.DataFrame({'time': pd.date_range('2018-01-01 01:13:43', '2018-01-01 23:59:59', periods=n),
                   'abc': np.random.randint(1,1000,n)})

dtypedatetime64[ns]时,它将重新采样到“圆形”垃圾箱:

df.dtypes
#time    datetime64[ns]
#abc              int32
#dtype: object

df.set_index('time').resample('600S').sum()
                      abc
time                     
2018-01-01 01:10:00  2572
2018-01-01 01:20:00  2257
2018-01-01 01:30:00  2470
2018-01-01 01:40:00  3131
2018-01-01 01:50:00  3402

使用timedelta64[ns],它会根据您的第一次观察开始垃圾箱:

df['time'] = pd.to_timedelta(df.time.dt.time.astype('str'))
df.dtypes
#time    timedelta64[ns]
#abc               int32
#dtype: object

df.set_index('time').resample('600S').sum()
           abc
time          
01:13:43  3432
01:23:43  2447
01:33:43  2588
01:43:43  3202
01:53:43  2547

因此,在timedelta64[ns]列的情况下,建议您从groupby中创建.dt.floor来创建垃圾箱,以从{{1 }}

[XX:00:00 - XX:10:00]

这与我们在第一种情况下使用df.groupby(df.time.dt.floor('600S')).sum() # abc #time #01:10:00 2572 #01:20:00 2257 #01:30:00 2470 #01:40:00 3131 #01:50:00 3402 dtype并将其装箱到“圆形”箱中的结果相同。

答案 2 :(得分:0)

如果您的用例对它很健壮,并且您希望延长时间实际开始时间,则解决方案是在开始时间添加一个空行你想要。

例如将第一次(如果索引已排序,则为 df.loc[0],否则为 df.index.min())截断为其小时 (.floor("h")):

df.loc[df.index.min().floor("h")] = None
df.sort_index(inplace=True) # cleaner, but not even needed

然后 resample() 将以此时间为起点(在 OP 的情况下为 9:00)。

这也可以用于扩展数据集实际结束后的时间范围。