我有一些时间序列data
(pandas.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 ****
...
谢谢您的帮助!
答案 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)})
当dtype
为datetime64[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
)。
这也可以用于扩展数据集实际结束后的时间范围。