Python实现月度8天周期内至少7天任务达标状态判断功能
合规报告用户任务完成情况校验实现
实现思路
- 先将日期列转成标准时间格式并排序,保证时间顺序正确
- 补全指定月份所有连续日期,无数据的日期默认视为未完成任务(req_met为FALSE),解决原数据日期不连续的问题
- 将req_met字段转成数值型(TRUE为1,FALSE为0),使用8天滑动窗口求和,只要存在任意窗口求和结果≥7就返回1,否则返回0
代码实现
import pandas as pd def check_compliance(user_month_df): # 1. 预处理:转换日期格式、转req_met为数值、按日期排序去重 df = user_month_df.copy() df['Date'] = pd.to_datetime(df['Date']) df['req_met'] = df['req_met'].map({'TRUE': 1, 'FALSE': 0}) df = df.sort_values('Date').drop_duplicates('Date').set_index('Date') # 2. 补全当月所有连续日期,缺失记录默认未完成(填0) month_start = df.index.min().to_period('M').to_timestamp() month_end = df.index.max().to_period('M').to_timestamp(how='end') full_date_range = pd.date_range(start=month_start, end=month_end, freq='D') df_full = df.reindex(full_date_range, fill_value=0) # 3. 滑动窗口统计8天内完成天数,判断是否有达标窗口 rolling_sum = df_full['req_met'].rolling(window=8, min_periods=8).sum() return 1 if (rolling_sum >= 7).any() else 0
使用说明
单用户单月测试
用你提供的示例数据测试输出符合预期:
# 示例数据构造 ids = 1 req_met = ['TRUE', 'TRUE', 'FALSE', 'FALSE', 'TRUE', 'TRUE', 'TRUE', 'FALSE', 'TRUE', 'TRUE', 'TRUE', 'TRUE', 'FALSE', 'FALSE', 'FALSE', 'FALSE', 'TRUE', 'TRUE', 'TRUE', 'FALSE'] date = ['2018-01-01', '2018-01-03', '2018-01-04', '2018-01-05', '2018-01-06', '2018-01-07', '2018-01-08', '2018-01-09', '2018-01-10', '2018-01-11', '2018-01-12', '2018-01-13', '2018-01-14', '2018-01-15', '2018-01-16', '2018-01-17', '2018-01-18', '2018-01-19', '2018-01-21', '2018-01-23'] df = pd.DataFrame({'id':ids, 'Date':date, 'req_met':req_met}) # 调用函数 print(check_compliance(df)) # 输出结果为1,符合预期
多用户多月批量计算
如果是全量数据,可以直接分组调用函数批量生成结果:
df['Date'] = pd.to_datetime(df['Date']) df['month'] = df['Date'].dt.to_period('M') compliance_result = df.groupby(['id', 'month']).apply(check_compliance).reset_index(name='compliance_flag')
内容的提问来源于stack exchange,提问作者Dr Wampa
相关产品推荐
相关产品推荐

