微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐