You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:45:05