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

如何用Pandas高效将起止日期数据转换为时间序列?

用Pandas高效实现日期区间值拆分需求

当然可以用Pandas高效实现这个需求,完全不需要低效的逐行循环!下面我会一步步拆解实现过程,顺便说说这个方法的名称。

问题背景

给定如下输入的Pandas DataFrame:

import pandas as pd

df = pd.DataFrame({
    'start_date': ['2018-05-17', '2018-05-22', '2018-05-14'],
    'end_date': ['2018-05-20', '2018-05-27', '2018-05-21'],
    'value': [4, 12, 8]
})

我们需要把每行的value按对应日期区间的天数(包含首尾日期)均分,生成按日期展开的日度时间序列,最终得到这样的结果:

date  value
0  2018-05-14      1
1  2018-05-15      1
2  2018-05-16      1
3  2018-05-17      2
4  2018-05-18      2
5  2018-05-19      2
6  2018-05-20      2
7  2018-05-21      1
8  2018-05-22      2
9  2018-05-23      2
10 2018-05-24      2
11 2018-05-25      2
12 2018-05-26      2
13 2018-05-27      2

高效实现步骤(无逐行循环)

核心思路是先为每个日期区间生成完整的日序列,再将均分后的value与这些日期一一绑定,全程用Pandas的内置矢量化操作,避免Python级别的循环:

1. 转换日期列类型

首先把start_date和end_date转成datetime格式,这是时间序列操作的基础:

df['start_date'] = pd.to_datetime(df['start_date'])
df['end_date'] = pd.to_datetime(df['end_date'])

2. 计算区间天数与每日均分value

计算每个区间的有效天数(要+1,因为首尾日期都算在内),再算出每天对应的value:

df['days'] = (df['end_date'] - df['start_date']).dt.days + 1
df['daily_value'] = df['value'] / df['days']

3. 生成日期序列并展开

用pd.date_range为每行生成完整的日期列表,再用explode把列表拆成单独的行:

df['date'] = df.apply(lambda x: pd.date_range(x['start_date'], x['end_date']), axis=1)
result = df.explode('date')[['date', 'daily_value']].rename(columns={'daily_value': 'value'})

4. (可选)重置索引

如果需要和示例一致的连续索引,重置一下即可:

result = result.reset_index(drop=True)

方法对应的名称

这种操作一般被称为时间序列的区间拆分与值摊薄(Interval Splitting and Value Amortization for Time Series),本质是将区间粒度的数据向下采样到日度,同时对指标值进行均分处理,属于Pandas时间序列处理中典型的「数据粒度转换」场景。

为什么这个方法高效?

这里用到的pd.date_range、explode以及生成日期序列的apply(这里的apply封装了矢量化的日期生成逻辑)都是Pandas的内置优化操作,底层基于C语言实现,完全避免了Python循环的性能损耗,处理大规模数据时优势会非常明显。

内容的提问来源于stack exchange,提问作者Bing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:13:07