Python 索引/装箱时间序列
我有一个像贝娄一样的数据帧Python 索引/装箱时间序列,python,pandas,time-series,Python,Pandas,Time Series,我有一个像贝娄一样的数据帧 ID Date 111 1.1.2018 222 5.1.2018 333 7.1.2018 444 8.1.2018 555 9.1.2018 666 13.1.2018 我想把它们分成5天的间隔。 输出应该是 ID Date Bin 111 1.1.2018 1 222 5.1.2018 1 333 7.1.2018 2 444
ID Date
111 1.1.2018
222 5.1.2018
333 7.1.2018
444 8.1.2018
555 9.1.2018
666 13.1.2018
我想把它们分成5天的间隔。
输出应该是
ID Date Bin
111 1.1.2018 1
222 5.1.2018 1
333 7.1.2018 2
444 8.1.2018 2
555 9.1.2018 2
666 13.1.2018 3
我怎样才能在python中做到这一点呢?看起来像是
groupby
+ngroup
是否:
df['Date'] = pd.to_datetime(df.Date, errors='coerce', dayfirst=True)
df['Bin'] = df.groupby(pd.Grouper(freq='5D', key='Date')).ngroup() + 1
如果您不想更改日期列,则可以首先调用
assign
进行基于副本的分配,然后执行groupby
:
df['Bin'] = df.assign(
Date=pd.to_datetime(df.Date, errors='coerce', dayfirst=True)
).groupby(pd.Grouper(freq='5D', key='Date')).ngroup() + 1
df
ID Date Bin
0 111 1.1.2018 1
1 222 5.1.2018 1
2 333 7.1.2018 2
3 444 8.1.2018 2
4 555 9.1.2018 2
5 666 13.1.2018 3
一种方法是创建一个日期范围数组并使用
numpy.digitalize
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
date_ranges = pd.date_range(df['Date'].min(), df['Date'].max(), freq='5D')\
.astype(np.int64).values
df['Bin'] = np.digitize(df['Date'].astype(np.int64).values, date_ranges)
结果:
ID Date Bin
0 111 2018-01-01 1
1 222 2018-01-05 1
2 333 2018-01-07 2
3 444 2018-01-08 2
4 555 2018-01-09 2
5 666 2018-01-13 3
非常感谢@coldspeed。不知道ngroup的事。我真的很感激你的快速回答!值得注意的是,
ngroup
仅在v.0.20.2+版本中提供(于2017年6月发布)。
ID Date Bin
0 111 2018-01-01 1
1 222 2018-01-05 1
2 333 2018-01-07 2
3 444 2018-01-08 2
4 555 2018-01-09 2
5 666 2018-01-13 3