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

如何修改pandas.Series.resample生成的时间标签为原始时间?

问题描述

给定如下示例数据:

import pandas as pd
import numpy as np

df1 = pd.DataFrame({
    'mark': ['A']*6,
    'date': ['2021-02-01', '2021-03-31', '2021-04-01', '2021-06-01', '2021-09-30', '2021-12-30'],
    'prop': np.arange(0.1, 0.7, 0.1)})

数据展示:

mark        date  prop
0    A  2021-02-01   0.1
1    A  2021-03-31   0.2
2    A  2021-04-01   0.3
3    A  2021-06-01   0.4
4    A  2021-09-30   0.5
5    A  2021-12-30   0.6

执行以下重采样操作:

df1['date'] = pd.to_datetime(df1['date'])
tmp = df1.set_index(['date'])
result = tmp['prop'].resample('Q', closed='left').first()

得到结果:

date
2021-03-31    0.1
2021-06-30    0.2
2021-09-30    NaN
2021-12-31    0.5
Freq: Q-DEC, Name: prop, dtype: float64

期望将结果的时间标签替换为原始数据中的对应日期,得到如下输出:

2021-02-01    0.1
2021-03-31    0.2
NaN           NaN
2021-09-30    0.5
解决方案

方法一:分组时直接保留原始日期

直接按指定规则的季度分组,同时提取每组的第一个原始日期和prop值,再补全缺失季度的项:

df1['date'] = pd.to_datetime(df1['date'])

# 按左闭季度分组,同时获取每组的第一个原始日期和prop值
grouped = df1.groupby(pd.Grouper(key='date', freq='Q', closed='left')).agg(
    original_date=('date', 'first'),
    prop=('prop', 'first')
)

# 生成所有需要的季度范围
all_quarters = pd.date_range(
    start=df1['date'].min(), 
    end=df1['date'].max(), 
    freq='Q-DEC', 
    closed='left'
)

# 构建最终结果:匹配原始日期,无对应值则设为NaN
final_index = [
    grouped.loc[q, 'original_date'] if q in grouped.index else pd.NA 
    for q in all_quarters
]
final_result = pd.Series(
    [grouped.loc[q, 'prop'] if q in grouped.index else np.nan for q in all_quarters],
    index=final_index
)

print(final_result)

输出:

2021-02-01    0.1
2021-03-31    0.2
<NA>          NaN
2021-09-30    0.5
dtype: float64

方法二:重采样后映射原始日期

先完成重采样,再通过季度标签匹配替换索引为原始日期:

df1['date'] = pd.to_datetime(df1['date'])
tmp = df1.set_index(['date'])
resampled = tmp['prop'].resample('Q', closed='left').first()

# 给原始数据添加和重采样规则一致的季度结束时间标签
df1['quarter_end'] = df1['date'].dt.to_period('Q').dt.end_time

# 构建季度结束时间到原始日期的映射(取每组第一个日期)
quarter_map = df1.groupby('quarter_end')['date'].first().to_dict()

# 替换重采样结果的索引
resampled.index = resampled.index.map(lambda x: quarter_map.get(x, pd.NA))

print(resampled)

输出:

2021-02-01    0.1
2021-03-31    0.2
<NA>          NaN
2021-09-30    0.5
Freq: Q-DEC, Name: prop, dtype: float64

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:01:09