ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-12-07 10:34:23  阅读:239  来源: 互联网

标签:stat 新字 df pandas days month str date 多字段


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

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

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

标签:stat,新字,df,pandas,days,month,str,date,多字段
来源: https://www.cnblogs.com/geoffreygao/p/15654760.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有