考虑以下重新采样的系列:
import pandas as pd
index = pd.date_range('1/1/2000', periods=30, freq='T')
series = pd.Series(range(30), index=index)
series.resample('3T')
我想在原始series
上添加一个新列,该列为原始(未重新采样的数据)的每一行指示该行所属的重新采样数据的存储桶。因此,对于上述情况的前几行,应该是:
series resample_id
2000-01-01 00:00:00 0 0
2000-01-01 00:01:00 1 0
2000-01-01 00:02:00 2 0
2000-01-01 00:03:00 3 1
因为前三行位于同一重新采样的存储桶中。
答案 0 :(得分:3)
从索引创建Series
,先创建transform
,然后再创建factorize
:
index = pd.date_range('1/1/2000', periods=30, freq='T')
series = pd.Series(range(30), index=index)
s1 = series.index.to_series().resample('3T').transform('first')
df = series.to_frame('series').assign(resample_id = pd.factorize(s1)[0])
print (df)
series resample_id
2000-01-01 00:00:00 0 0
2000-01-01 00:01:00 1 0
2000-01-01 00:02:00 2 0
2000-01-01 00:03:00 3 1
2000-01-01 00:04:00 4 1
2000-01-01 00:05:00 5 1
2000-01-01 00:06:00 6 2
2000-01-01 00:07:00 7 2
2000-01-01 00:08:00 8 2
2000-01-01 00:09:00 9 3
另一种解决方案是floor
和Datetimeindex
的底线factorize
:
df = series.to_frame('series').assign(resample_id = pd.factorize(series.index.floor('3T'))[0])
或者将GroupBy.ngroup
与Grouper
一起使用,以代替resample
:
s1 = series.groupby(pd.Grouper(freq='3T')).ngroup()
df = series.to_frame('series').assign(resample_id = s1)
因为:
s1 = series.resample('3T').ngroup()
AttributeError:“ DatetimeIndexResampler”对象没有属性“ ngroup”