-
慕村225694
用于isin检查每组的日期范围user以及agg.sum每组返回的布尔掩码df['dt'] = pd.to_datetime(df['dt']) #if `dt` columns already in datetime dtype, ignore thischeck_dates = pd.date_range('2015-12-31', '2016-01-10', freq='D')s = df.groupby('user').dt.agg(lambda x: (~check_dates.isin(x)).sum())Out[920]:usera 5b 4c 0Name: dt, dtype: int64
-
饮歌长啸
### Convert your dates to datetimedf['dt'] = pd.to_datetime(df['dt'], infer_datetime_format=True)### Create the list of dates per useruser_days = df.groupby('user')['dt'].apply(list)### Initialize the final dataframedf_miss_dates = pd.DataFrame(user_days)all_dates = pd.date_range('2015-12-31', '2016-01-10', freq='D')### Find the number of missing dates per userdf_miss_dates['missing_days'] = df_miss_dates['dt'].apply(lambda x: len(set(all_dates) - set(x)))df_miss_dates.drop(columns='dt', inplace=True)print(df_miss_dates)输出: missing_daysuser a 5b 4c 0
-
天涯尽头无女友
定义以下函数:def missingDates(grp : pd.Series, d1 : pd.Timestamp, d2 : pd.Timestamp): ndTotal = (d2 - d1).days + 1 ndPresent = grp[grp.between(d1, d2)].index.size return ndTotal - ndPresent然后将其应用到每个组并更改为 DataFrame (正如我从您的帖子中看到的,您只需要一个DataFrame,有 2 列):result = df.groupby('user')['dt'].apply(missingDates, pd.to_datetime('2015-12-31'), pd.to_datetime('2016-01-10'))\ .rename('missing_days').reset_index()结果是: user missing_days0 a 51 b 42 c 0我的解决方案依赖于这样一个事实:每个组中的日期都是唯一的,并且所有日期都没有时间部分。如果不满足这些条件,则应添加日期规范化和调用唯一 函数。补充说明:将dt(列名)更改为其他名称,因为dt是Pandas中日期访问器的名称。用列名或变量名“覆盖”标准pandasonic名称是一种不好的做法。
-
潇潇雨雨
你可以这样做from datetime import date, timedeltasdate = date(2015, 12, 31) # start dateedate = date(2016, 1, 10) # end datedelta = edate - sdate # as timedeltadays=[]for i in range(delta.days + 1): day = sdate + timedelta(days=i) days.append(str(day))user=[]missing_days = []for user_n in df.user.unique(): user_days = df.loc[df.user ==user_n,'dt' ].to_list() md = len([day for day in days if day not in user_days]) user.append(user_n) missing_days.append(md)new_df = pd.DataFrame({'user': user,'missing_days': missing_days})new_df输出user missing_daysa 5b 4