提取2021年9月各用户不在自有记录及指定列表内的剩余日期的方法
请使用Markdown格式化以下内容
- 标题使用井号(#)标注
- 列表项使用短横线(-)开头
- 文本强调使用星号(*)包裹
- 代码或命令使用反引号(`)包裹
- 引用文本使用大于号(>)开头
- 链接格式为链接文本
- 图片格式为
需求实现方案
实现逻辑
- 先自动计算指定年月的总天数,生成当月全量日期的集合
- 定义全局排除日期的集合
- 筛选出目标年月的用户数据,按用户维度聚合该用户当月已有的日期集合
- 对每个用户,用全量日期集合先后减去全局排除集合、用户自有日期集合,排序后转成逗号分隔的字符串即可得到结果
代码实现(基于Pandas)
import pandas as pd import calendar # 定义基础参数 exclude_days = [1,5,16,29] target_year = 2021 target_month = 9 # 自动计算当月总天数,适配不同年月无需硬编码 _, total_days = calendar.monthrange(target_year, target_month) all_day_set = set(range(1, total_days + 1)) exclude_set = set(exclude_days) # 过滤出目标年月的用户数据 target_df = df[(df['year'] == target_year) & (df['month'] == target_month)] # 按用户聚合自有日期集合 user_day_group = target_df.groupby('user_id', as_index=False)['day'].agg(set) # 定义剩余日期计算函数 def calc_remaining(row): remaining_days = sorted(all_day_set - exclude_set - row['day']) return ','.join(map(str, remaining_days)) # 生成结果列 user_day_group['remaining_days_of_month'] = user_day_group.apply(calc_remaining, axis=1) # 输出最终结果 result = user_day_group[['user_id', 'remaining_days_of_month']] print(result)
运行上述代码即可得到和预期完全一致的输出结果。
内容的提问来源于stack exchange,提问作者astroboy3
相关产品推荐
相关产品推荐

