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