代码之家  ›  专栏  ›  技术社区  ›  user288609

基于每日时间序列数据帧创建一周/一天/周末时间序列数据帧

  •  1
  • user288609  · 技术社区  · 7 年前

    例如,我用时间序列信息创建了一个数据帧

    Time      daily-bill
    2012-01-01   200
    2012-01-02  300
    2012-01-03   100
    2012-01-04    500
    ….
    

    我想基于上述时间序列创建另一个时间序列数据帧。如何在熊猫身上做到这一点?

    Time(weekday-and-weekend)                       total-bill
    Monday-Friday
    Weekend
    Monday-Friday
    Weekend
    Monday-Friday
    Weekend
    

    换句话说,时间步长将是一个连续的时间序列 weekday weekend 这个 周工作日 包括 Monday to Friday ; 而 周末 包括 Saturday Sunday 这个 total-bill 列将存储相应日期内发生的账单总额,这些信息来自现有的时间序列。

    1 回复  |  直到 7 年前
        1
  •  1
  •   jezrael    7 年前

    使用:

    print (df)
            Time  daily-bill
    0 2012-01-01         200
    1 2012-01-02         300
    2 2012-01-03         100
    3 2012-01-04         500
    4 2012-01-05         200
    5 2012-01-06         300
    6 2012-01-07         100
    7 2012-01-08         500
    8 2012-01-09         500
    
    arr = np.where(df['Time'].dt.weekday > 4, 'Weekend','Monday-Friday')
    
    s = pd.Series(arr)
    s1 = s.ne(s.shift()).cumsum()
    
    df = (df['daily-bill'].groupby([s1,s.rename('Time')])
                         .sum()
                         .reset_index(level=0, drop=True)
                         .reset_index())
    print (df)
                Time  daily-bill
    0        Weekend         200
    1  Monday-Friday        1400
    2        Weekend         600
    3  Monday-Friday         500
    

    解释 :

    1. 首先创造 Series 通过 weekday numpy.where .
    2. 然后再创造一个 系列 这是由 cumsum 转移的 s 通过 shift 用于区分连续值
    3. 总数的 sum 并通过 reset_index 具有 drop=True

    细节 :

    print (s)
    0          Weekend
    1    Monday-Friday
    2    Monday-Friday
    3    Monday-Friday
    4    Monday-Friday
    5    Monday-Friday
    6          Weekend
    7          Weekend
    8    Monday-Friday
    dtype: object
    
    print (s1)
    0    1
    1    2
    2    2
    3    2
    4    2
    5    2
    6    3
    7    3
    8    4
    dtype: int32
    

    编辑:

    如果第一列输入 DataFrame DatetimeIndex :

    print (df)
                daily-bill
    Time                  
    2012-01-01         200
    2012-01-02         300
    2012-01-03         100
    2012-01-04         500
    2012-01-05         200
    2012-01-06         300
    2012-01-07         100
    2012-01-08         500
    2012-01-09         500
    
    arr = np.where(df.index.weekday > 4, 'Weekend','Monday-Friday')
    
    s = pd.Series(arr, index=df.index)
    s1 = s.ne(s.shift()).cumsum()
    
    df = (df['daily-bill'].groupby([s1,s.rename('Time')])
                         .sum()
                         .reset_index(level=0, drop=True)
                         .reset_index())
    print (df)
                Time  daily-bill
    0        Weekend         200
    1  Monday-Friday        1400
    2        Weekend         600
    3  Monday-Friday         500