因为需要,需要处理某人在一段时间内每个月的用时天数,这个好办,基于日期起始值,获取月份,再获取月份对应的天数,需要考虑加入和退出要。
通过起始日期获取不同月份对应的投入天数
方法1: 利用pandas的时间处理
start_d = pd.to_datetime('2021-4-02') # 起始
end_d = pd.to_datetime(pd.datetime.Now()) # 终止
s = pd.Series(index=pd.date_range(start_d, end_d)) # 获取时间范围
df = s.resample('MS').size().rename_axis('Month').reset_index(name='NumDays')
df['Month'] = df['Month'].dt.to_period('m') # 取月份
# display(df)
df.Month = df.Month.astype('str')
month_day_map = df.to_dict()
month_date = dict()
for i in range(df.shape[0]):
key = month_day_map.get('Month').get(i)
value = month_day_map.get('NumDays').get(i)
month_date[key] = value
month_date
这段代码理论即可完成需求,当时任务较急,只是直接取了整个项目的最大最小日期,先整体去了月份对应的天数。后续每人单独处理,见方法2。
方法2:
def stat_date_month_judge(stat_month_, stat_date_min_, stat_date_max_, days_):
if str(stat_date_max_)[:10][:7] == str(stat_date_min_)[:10][:7]:
return (stat_date_max_-stat_date_min_).days + 1
elif stat_month_ == str(stat_date_min_)[:10][:7] :
return days_ - int(str(stat_date_min_)[:10][8:]) + 1
elif stat_month_ ==str(stat_date_max_)[:10][:7]:
return int(str(stat_date_max_)[:10][8:])
else:
return days_
operation_agg_month_['days_cnt'] = operation_agg_month_.apply(lambda fr: stat_date_month_judge(stat_month_=fr.stat_month,
stat_date_min_=fr.stat_date_min,
stat_date_max_=fr.stat_date_max,
days_=fr.days), axis=1)
数据:链接:https://pan.baidu.com/s/1gm6EkZWddD36qiIN4ccClg
提取码:t9wb
pandas 多字段判断并计算生成新字段
见方法2