【问题标题】:extend a pandas datetimeindex by 1 period将 pandas datetimeindex 延长 1 个句点
【发布时间】:2017-01-23 19:23:50
【问题描述】:

考虑DateTimeIndexdates

dates = pd.date_range('2016-01-29', periods=4, freq='BM')
dates

DatetimeIndex(['2016-01-29', '2016-02-29', '2016-03-31', '2016-04-29'],
              dtype='datetime64[ns]', freq='BM')

我想以附加到对象的频率将索引延长一个周期。


我期待

pd.date_range('2016-01-29', periods=5, freq='BM')

DatetimeIndex(['2016-01-29', '2016-02-29', '2016-03-31', '2016-04-29',
               '2016-05-31'],
              dtype='datetime64[ns]', freq='BM')

我试过了

dates.append(dates[[-1]] + pd.offsets.BusinessMonthEnd())

然而

  • 未概括为使用频率dates
  • 我收到性能警告

    PerformanceWarning:将非矢量化 DateOffset 应用于 Series 或 DatetimeIndex

【问题讨论】:

    标签: python pandas datetimeindex


    【解决方案1】:

    最好的解决办法是:

    import pandas as pd
    dates = pd.date_range('2016-01-29', periods=4, freq='BM')
    extended = dates.union(dates.shift(n)[-n:])
    

    其中 n 是您要添加的句点数。使用n=4,您将获得如下扩展的日期范围:

    DatetimeIndex(['2016-01-29', '2016-02-29', '2016-03-31', '2016-04-29',
                   '2016-05-31', '2016-06-30', '2016-07-29', '2016-08-31'],
                  dtype='datetime64[ns]', freq='BM')
    

    【讨论】:

      【解决方案2】:

      pandas==1.1.1 回答 +1

      为了跟进此事,对于pandas==1.1.1,我发现这是最好的解决方案:

      dates.union(pd.date_range(dates[-1] + dates.freq, periods=1, freq=dates.freq))

      使用 n 的通用答案

      n=3
      dates.union(pd.date_range(dates[-1] + dates.freq, periods=n, freq=dates.freq))
      

      学分

      结合@alberto-garcia-raboso 的回答和@ballpointben 的评论。

      什么没用

      • 以下刚刚格式化为Index,而不是DateTimeIndexdates.union([dates[-1] + dates.freq])
      • dates[-1] + 1 也已弃用。

      【讨论】:

      • + dates.freq 并没有为我持续工作,尽管这有效:dates.union(pd.date_range(dates[-1], periods=(n + 1), freq=dates.freq)[1:])
      【解决方案3】:

      我会使用.tshift 函数,然后相应地使用:

      dr = pd.date_range(start='1/1/2020', periods=5, freq='D')
      df = pd.DataFrame(data=[1,2,3,4,5], 
                        index=dr,
                        columns=['A'])
      df.head()
                  A
      2020-01-01  1
      2020-01-02  2
      2020-01-03  3
      2020-01-04  4
      2020-01-05  5 <-
      
      df.tshift()
                  A
      2020-01-02  1
      2020-01-03  2
      2020-01-04  3
      2020-01-05  4
      2020-01-06  5 <-
      
      other = pd.DataFrame([6], columns=['A'], index=[df.tshift().index[-1]])
      other.head()
                  A
      2020-01-06  6
      
      df.append(other)
                  A
      2020-01-01  1
      2020-01-02  2
      2020-01-03  3
      2020-01-04  4
      2020-01-05  5
      2020-01-06  6 <-
      

      【讨论】:

      • 似乎 tshift 自 1.1.0 版以来已被弃用。我建议使用 fccoelho 的答案。
      【解决方案4】:

      DatetimeIndex 中的时间戳已经知道它们描述的是营业月结,因此您只需添加 1:

      import pandas as pd
      dates = pd.date_range('2016-01-29', periods=4, freq='BM')
      
      print(repr(dates[-1]))
      # => Timestamp('2016-04-29 00:00:00', offset='BM')
      
      print(repr(dates[-1] + 1))
      # => Timestamp('2016-05-31 00:00:00', offset='BM')
      

      您可以使用 .union 将后者添加到您的索引中:

      dates = dates.union([dates[-1] + 1])
      print(dates)
      # => DatetimeIndex(['2016-01-29', '2016-02-29', '2016-03-31', '2016-04-29',
      #                   '2016-05-31'],
      #                  dtype='datetime64[ns]', freq='BM')
      

      .append 相比,它保留了偏移量的知识。

      【讨论】:

      • 非常好的解决方案!
      • 如果你想将索引扩展n句点,你可以使用dates.union(pd.date_range(dates[-1]+1, periods=n, freq=dates.freq))
      • 现在已弃用。不推荐对 Timestamp 进行整数和整数数组的加法/减法,将在未来的版本中删除。不要加/减n,而是使用n * self.freq
      【解决方案5】:

      试试这个:

      In [207]: dates = dates.append(pd.DatetimeIndex(pd.Series(dates[-1] + pd.offsets.BusinessMonthEnd())))
      
      In [208]: dates
      Out[208]: DatetimeIndex(['2016-01-29', '2016-02-29', '2016-03-31', '2016-04-29', '2016-05-31'], dtype='datetime64[ns]', freq=None)
      

      或使用list ([...]) 代替pd.Series()

      In [211]: dates.append(pd.DatetimeIndex([dates[-1] + pd.offsets.BusinessMonthEnd()]))
      Out[211]: DatetimeIndex(['2016-01-29', '2016-02-29', '2016-03-31', '2016-04-29', '2016-05-31'], dtype='datetime64[ns]', freq=None)
      

      【讨论】:

        猜你喜欢
        • 2019-06-22
        • 2018-06-02
        • 2019-07-23
        • 1970-01-01
        • 1970-01-01
        • 2020-08-14
        • 2023-02-22
        • 1970-01-01
        • 2023-04-01
        相关资源
        最近更新 更多