如何修改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
相关产品推荐
相关产品推荐

