簡體   English   中英

索引/裝訂時間序列

[英]Indexing/Binning 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   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

df
    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

如果您不想更改“日期”列,則可以首先為基於副本的分配調用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.digitize

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM