pandas 通过起始日期获取不同月份对应的投入天数,以及基于多字段判断计算生成新字段

因为需要,需要处理某人在一段时间内每个月的用时天数,这个好办,基于日期起始值,获取月份,再获取月份对应的天数,需要考虑加入和退出要。

通过起始日期获取不同月份对应的投入天数

方法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

原文地址:https://www.cnblogs.com/geoffreygao/p/15654760.html