如何编写公式计算指定日期范围在各对应月份所占天数
日期区间分月占比天数统计实现方案
Excel 公式实现
适用版本:Excel 365 / 2021 及以上(支持动态数组溢出)
- 假设起始日期存储在
A1单元格,结束日期存储在B1单元格 - 直接粘贴以下公式到任意空白单元格,即可自动输出所有月份的统计结果:
=LET( month_list, EOMONTH(A1, SEQUENCE(DATEDIF(A1, B1, "m")+1, , -1)) + 1, month_days, MIN(B1, EOMONTH(month_list, 0)) - MAX(A1, month_list) + 1, TEXT(month_list, "mmmm yyyy") & " - " & month_days & "天" )
示例验证:A1输入
1/1/2021、B1输入23/3/2021时,公式会自动溢出三行结果,和需求示例完全一致。
低版本Excel兼容方案
手动输入公式后下拉即可:
- 第一行空白单元格(比如C1)输入月份生成公式:
=EOMONTH(A$1, ROW(A1)-1) + 1 - 相邻单元格(比如D1)输入统计公式:
=TEXT(C1,"mmmm yyyy")&" - "&MIN(B$1,EOMONTH(C1,0))-MAX(A$1,C1)+1&"天" - 下拉C、D列公式,直到C列生成的月份超过B1的月份为止。
Python 代码实现
依赖安装(如果未安装相关库)
pip install python-dateutil
完整代码
from datetime import datetime, timedelta from dateutil.rrule import rrule, MONTHLY from dateutil.parser import parse def count_month_days(start_date_str: str, end_date_str: str) -> list: # 解析输入的日期(适配日/月/年格式) start_dt = parse(start_date_str, dayfirst=True).date() end_dt = parse(end_date_str, dayfirst=True).date() result = [] # 遍历区间覆盖的所有月份 for month in rrule(MONTHLY, dtstart=start_dt.replace(day=1), until=end_dt.replace(day=1)): month_first = month.date() # 计算当月最后一天 if month.month == 12: month_last = month.replace(year=month.year+1, month=1, day=1).date() - timedelta(days=1) else: month_last = month.replace(month=month.month+1, day=1).date() - timedelta(days=1) # 计算有效区间天数 valid_start = max(start_dt, month_first) valid_end = min(end_dt, month_last) days = (valid_end - valid_start).days + 1 result.append(f"{valid_start.strftime('%B %Y')} - {days}天") return result # 调用示例 print(count_month_days("1/1/2021", "23/3/2021"))
输出结果:
['January 2021 - 31天', 'February 2021 - 28天', 'March 2021 - 23天']
内容的提问来源于stack exchange,提问作者Biha
相关产品推荐
相关产品推荐

