【问题标题】:Pandas: Generate a timeseries filled with the last day of the yearPandas:生成一个充满一年中最后一天的时间序列
【发布时间】:2017-11-05 12:38:56
【问题描述】:

假设我有一个不规则间隔的 Pandas 时间序列。

2010-01-04   88.82 
2010-11-29   90.70 
2010-12-01   90.09  
2011-02-26   90.10 
2011-08-01   90.55  
2011-09-21   89.50  
2012-04-01   89.06 
2012-04-30   90.22  
2012-05-03   90.21

我想从索引创建另一个时间序列,其中列由一年中的最后一个日期填充。因此,对于 2010 年的日期,它将显示 2010-12-01,对于 2011 年的日期,它将显示 2011-09-21 等。所需的输出是

2010-01-04   2010-12-01
2010-11-29   2010-12-01
2010-12-01   2010-12-01 
2011-02-26   2011-09-21
2011-08-01   2011-09-21 
2011-09-21   2011-09-21  
2012-04-01   2012-05-03
2012-04-30   2012-05-03 
2012-05-03   2012-05-03

我可以提取索引并按年份分组。

end_dates=[]
df_idx = df.index
year_df = df_idx.groupby(df_idx.year)
for yr in year_df.keys():
    end_dates.append(max(year_df[yr]))

这给了我一个年度结束日期列表。但是如何将这些结束日期关联回原始索引以达到所需的输出?

【问题讨论】:

    标签: python pandas time-series pandas-groupby


    【解决方案1】:

    确保您的索引是 datetimeindex 对象。

    如果你有熊猫系列,你可以使用这个:

    s.to_frame().assign(end_dates=s.groupby(s.index.year).transform(lambda x: x.index.max()))
    

    或者如果您已经有一个数据框:

    df.assign(end_dates=df.groupby(df.index.year)['A'].transform(lambda x: x.index.max()))
    

    输出:

                    1  end_dates
    0                           
    2010-01-04  88.82 2010-12-01
    2010-11-29  90.70 2010-12-01
    2010-12-01  90.09 2010-12-01
    2011-02-26  90.10 2011-09-21
    2011-08-01  90.55 2011-09-21
    2011-09-21  89.50 2011-09-21
    2012-04-01  89.06 2012-05-03
    2012-04-30  90.22 2012-05-03
    2012-05-03  90.21 2012-05-03
    

    【讨论】:

    • 谢谢斯科特。我从分配函数中收到此错误。 ValueError:错误的项目数通过 2,位置意味着 1。我的原始数据框实际上是两列,所以我不得不修改您的代码以提取一列并将其转换回数据框,然后再分配,即 df.assign(end_dates=df. iloc[:,0].to_frame().groupby(df.index.year).transform(lambda x: x.index.max()))
    • 是你在索引中的日期,如果不是你可以 set_index 然后运行第二条语句。然后是 reset_index。
    • 是的,日期在索引中。如果日期不是索引,我不太明白您的想法。感谢您的耐心等待。
    • 按原样运行第二个语句会发生什么?
    • 它给出了以下分配错误。 ValueError:错误的项目数通过 2,位置意味着 1。
    猜你喜欢
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    相关资源
    最近更新 更多