如何创建一个yearmonth序列作为数据帧中的索引?

2024-10-03 11:23:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从month2019-01开始,然后添加任意数量的consequential months,并将其用作pandas数据帧中的索引。我发现一些建议指向使用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')

有什么更好的方法?你知道吗


Tags: to数据importpandas数量dateasnp
2条回答

您可以使用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')

您可以通过^{}创建PeriodIndex

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')

如果再加上2天,您的解决方案应该有效:

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

相关问题 更多 >