时间戳 GroupBy pandas

问题描述

我正在尝试对时间序列数据集进行分组,以便我可以找到一周中最频繁的一天、一个月中的一周等。

我的数据集如下所示:

ID Date      
1  2020-01-02
1  2020-01-09
1  2020-01-08

我的输出数据集应该如下所示:

ID Pref_Day_Of_Week_A Pref_Week_Of_Month_A 
1  4                  2

(这里的星期四是星期几,第二周是给定日期的星期几) 因此,本质上试图找出每个 ID 的模式(最频繁)星期几和模式(最频繁)星期几。知道如何在 Python 中实现这一点吗?数据集包含多个这样的ID,这只是1个这样的ID的例子,数据集有多个具有相似时间戳数据的ID。

解决方法

您可以使用 .groupby()ID 分组,然后使用 .agg()命名聚合 进行聚合,为 2 个源列 {{1 }} 和 dayofweek。通过 pd.Series.mode

获取模式
week

结果:

df = pd.DataFrame({"ID":[1,1,2,2],"Date": ["2020-01-02","2020-01-09","2020-01-08","2020-01-04","2020-01-21","2020-01-22"] })
df.Date = pd.to_datetime(df.Date)
df['dayofweek'] = df.Date.dt.dayofweek
df['week'] = df.Date.dt.isocalendar().week

df_out = (df.groupby('ID',as_index=False)[['dayofweek','week']]
            .agg(Pref_Day_Of_Week_A=('dayofweek',lambda x:  pd.Series.mode(x)[0]),Pref_Week_Of_Month_A=('week',lambda x:  pd.Series.mode(x)[0]))
         )
,

Series.mode 的命名聚合中使用自定义的 lambda 函数,通过 Series.iatGroupBy.agg 选择第一个模式:

df = pd.DataFrame({"ID":[1,"2020-01-08"]*2})

#https://stackoverflow.com/a/64192858/2901002
def weekinmonth(dates):
    """Get week number in a month.
    
    Parameters: 
        dates (pd.Series): Series of dates.
    Returns: 
        pd.Series: Week number in a month.
    """
    firstday_in_month = dates - pd.to_timedelta(dates.dt.day - 1,unit='d')
    return (dates.dt.day-1 + firstday_in_month.dt.weekday) // 7 + 1
    

df.Date = pd.to_datetime(df.Date)
df['dayofweek'] = df.Date.dt.dayofweek
df['week'] = weekinmonth(df['Date'])

f = lambda x: x.mode().iat[0]
df1 = (df.groupby('ID',as_index=False).agg(Pref_Day_Of_Week_A=('dayofweek',f),f)))
print (df1)
   ID  Pref_Day_Of_Week_A  Pref_Week_Of_Month_A
0   1                   3                     2
1   2                   3                     2
,
import pandas as pd
df = pd.DataFrame({"ID":[1,1],"2020-01-08"]})
df.Date = pd.to_datetime(df.Date)
df['dayofweek'] = df.Date.dt.dayofweek
df['week'] = df.Date.dt.isocalendar().week
df[['ID','dayofweek','week']].mode()

输出:

   ID  dayofweek  week
0   1          3     2

PS:dayofweek 假设一周从星期一开始,用 0 表示,到星期日结束,用 6 表示。这使得星期四的日期为 3