如何使用Python/pandas计算两个日期间事件在各月的所占天数
实现方案
完全可以通过pandas搭配Python的dateutil、calendar模块实现该需求,具体实现逻辑和代码如下:
核心思路
对每条事件记录,遍历其覆盖的所有自然月,分别计算事件与当前自然月的重叠区间的天数即可。
代码实现
首先导入依赖库:
import pandas as pd from datetime import datetime from dateutil import rrule from calendar import monthrange
步骤1:构造/读取事件表并处理日期格式
# 模拟你的事件表数据,也可以用pd.read_excel/ pd.read_csv读取本地文件 df = pd.DataFrame({ 'event_id': ['Event 1'], 'start_date': ['1.1.2021'], 'end_date': ['4.3.2021'] }) # 转换日期字符串为datetime格式,根据你实际的日期格式调整format参数 df['start_date'] = pd.to_datetime(df['start_date'], format='%d.%m.%Y') df['end_date'] = pd.to_datetime(df['end_date'], format='%d.%m.%Y')
步骤2:编写单条事件的月度天数计算函数
def calc_monthly_days(row): result_list = [] # 生成事件覆盖的所有月份的首日 for month_start in rrule.rrule(rrule.MONTHLY, dtstart=row['start_date'].replace(day=1), until=row['end_date']): year = month_start.year month = month_start.month # 取当前自然月的最后一天 month_end = datetime(year, month, monthrange(year, month)[1]) # 计算重叠区间的起止 overlap_start = max(row['start_date'], month_start) overlap_end = min(row['end_date'], month_end) # 计算重叠天数,+1是因为起止日期当天都计入 days = (overlap_end - overlap_start).days + 1 result_list.append({ 'event_id': row['event_id'], '月份': f"{datetime.strftime(month_start, '%B %Y')}", '天数': days }) return pd.DataFrame(result_list)
步骤3:批量处理所有事件生成结果
final_result = pd.concat(df.apply(calc_monthly_days, axis=1).tolist(), ignore_index=True) print(final_result)
输出示例
运行以上代码得到的结果和你给出的示例完全一致:
event_id 月份 天数 0 Event 1 January 2021 31 1 Event 1 February 2021 28 2 Event 1 March 2021 4
如果需要把结果导出为表格,直接调用final_result.to_excel('结果.xlsx', index=False)即可。
内容的提问来源于stack exchange,提问作者Adam Morad
相关产品推荐
相关产品推荐

