代码之家  ›  专栏  ›  技术社区  ›  vestland

如何创建年-月序列以用作数据帧中的索引?

  •  0
  • vestland  · 技术社区  · 6 年前

    2019-01 然后添加任意数量的consequential months,并将其用作数据帧中的索引。我找到了一些建议 pd.to_timedelta

    详情如下:

    如果以日期开始,并添加5个句点,如下所示:

    import pandas as pd
    import numpy as np
    
    date = pd.to_datetime("1st of Jan, 2019")
    dates = date+pd.to_timedelta(np.arange(5), 'M')
    

    然后你会得到:

    DatetimeIndex(['2019-01-01 00:00:00', '2019-01-31 10:29:06',
                   '2019-03-02 20:58:12', '2019-04-02 07:27:18',
                   '2019-05-02 17:56:24'],
                  dtype='datetime64[ns]', freq=None)
    

    2019-01 这样地:

    dates = dates.map(lambda x: x.strftime('%Y-%m'))
    dates = dates.drop_duplicates()
    

    但正如你所见, 2019-02

    Index(['2019-01', '2019-03', '2019-04', '2019-05'], dtype='object')
    

    有什么更好的方法?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Chris Adams    6 年前

    你可以用 pandas.date_range :

    pd.date_range(date, periods=5, freq='M').strftime('%Y-%m')
    

    Index(['2019-01', '2019-02', '2019-03', '2019-04', '2019-05'], dtype='object')
    
        2
  •  3
  •   jezrael    6 年前

    您可以创建 PeriodIndex 通过 period_range :

    dates = pd.period_range(date, periods=5, freq='M')
    print (dates)
    PeriodIndex(['2019-01', '2019-02', '2019-03', '2019-04', '2019-05'], 
                dtype='period[M]', freq='M')
    

    dates = (date + pd.to_timedelta(np.arange(5), unit='M') + pd.Timedelta(2, unit='d')).strftime('%Y-%m')
    
    print (dates)
    Index(['2019-01', '2019-02', '2019-03', '2019-04', '2019-05'], dtype='object')
    

    验证:

    dates = (date + pd.to_timedelta(np.arange(120), unit='M') + pd.Timedelta(2, unit='d'))
            .month.value_counts()
    
    print (dates)
    
    12    10
    11    10
    10    10
    9     10
    8     10
    7     10
    6     10
    5     10
    4     10
    3     10
    2     10
    1     10
    dtype: int64