【问题标题】:Setting the datetime in a multiindex to last day of the month将多索引中的日期时间设置为该月的最后一天
【发布时间】:2021-07-12 16:18:12
【问题描述】:

我有一个多索引数据框并想更改日期级别,以便将每个月的最后一个值的日期更改为该月的最后一天。 任何帮助表示赞赏。

DataFrame (rolling_cov) 123610 行 × 10 列:

  Date                                 NoDur         Durbl           Manuf
  2018-12-27     NoDur                 0.000109      0.000112        0.000118
                 Durbl                 0.000112      0.000339        0.000238
                 Manuf                 0.000118      0.000238        0.000246
  2018-12-28     NoDur                 0.000109      0.000113        0.000117
                 Durbl                 0.000113      0.000339        0.000239
                 Manuf                 0.000117      0.000239        0.000242
  2018-12-31     NoDur                 0.000109      0.000113        0.000118
                 Durbl                 0.000113      0.000339        0.000239
                 Manuf                 0.000118      0.000239        0.000245

我尝试过的代码:

rolling_cov.index= 
rolling_cov.index.set_levels([rolling_cov.index.levels[0].
         apply(pd.to_datetime(df['Date'] , format="%Y%m") + MonthEnd(1))])

我收到的错误:

'DatetimeIndex' object has no attribute 'apply'

【问题讨论】:

    标签: python dataframe multi-index


    【解决方案1】:

    先将其转换为Series,更改值,然后用新索引替换原始索引可能更容易。

    idx = df.index.levels[0]
    
    ser = pd.Series(idx)
    last_of_mon = ser.groupby(ser.dt.year * 100 + ser.dt.month).last()
    
    ser = ser.apply(
        lambda x: x + pd.offsets.MonthBegin(1) - pd.offsets.Day(1)
            if x in last_of_mon.values
            else x
    )
    
    df.index.set_levels(ser, 0, inplace=True)
    

    请注意,+ pd.offsets.MonthBegin(1) - pd.offsets.Day(1) 用于更改为当月的最后一天。如果您在已经是本月最后一天的日期使用+ pd.offsets.MonthEnd(1),则会将其更改为下个月的最后一天。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多