pandas.date_range 自定义频率
pandas.date_range custom frequency
我正在尝试使用 pd.date_range 为 12 个月的滚动场景生成捕获该月第 2 天的日期列表。我不太清楚如何在文档中结合频率别名来实现这一点。下面是我所在的位置和输出。我想看看
['2020-05-02', '2020-04-02', '2020-03-02'...]
pd.date_range(end='2020-06-02',periods=12,freq=)
DatetimeIndex(['2020-05-22', '2020-05-23', '2020-05-24', '2020-05-25',
'2020-05-26', '2020-05-27', '2020-05-28', '2020-05-29',
'2020-05-30', '2020-05-31', '2020-06-01', '2020-06-02'],
dtype='datetime64[ns]', freq='D')
你能试试这个吗?假设您的 df
有日期
df.sort_index(inplace=True)
df.groupby(pd.TimeGrouper('M')).nth(2) #This is to get the second day
我假设你已经定义了:
- 结束日期,
- 期数,
如您在代码示例中所写。
要构建日期范围,请使用:
- date_range MS(月开始)频率,
- 结合 shift 1 天。
执行此操作的代码是:
rng = pd.date_range(end='2020-06-02', periods=12, freq='MS').shift(1, freq='D')
给予:
DatetimeIndex(['2019-07-02', '2019-08-02', '2019-09-02', '2019-10-02',
'2019-11-02', '2019-12-02', '2020-01-02', '2020-02-02',
'2020-03-02', '2020-04-02', '2020-05-02', '2020-06-02'],
dtype='datetime64[ns]', freq=None)
这次freq是None意思:没有"frequency acronym"
每个月从每月的第二天开始(有首字母缩写词
月开始和月结束),但生成的日期肯定是
如你所愿
您可以使用 pd.offsets.DateOffset
which implements the logic of relativedelta。它没有矢量化,所以使用简单的列表理解来获取日期。
import pandas as pd
date = pd.to_datetime('June 2, 2020')
pd.Index([date + pd.offsets.DateOffset(months=i) for i in range(12)])
#DatetimeIndex(['2020-06-02', '2020-07-02', '2020-08-02', '2020-09-02',
# '2020-10-02', '2020-11-02', '2020-12-02', '2021-01-02',
# '2021-02-02', '2021-03-02', '2021-04-02', '2021-05-02'],
# dtype='datetime64[ns]', freq=None)
如果您需要处理接近月底的日期,此方法会更安全一些。 2 月没有 29 天,但 pd.offsets.Dateoffset
的逻辑可以做到,所以我们仍然有 2 月的最后一个日期。
date = pd.to_datetime('June 29, 2020')
pd.Index([date + pd.offsets.DateOffset(months=i) for i in range(12)])
#DatetimeIndex(['2020-06-29', '2020-07-29', '2020-08-29', '2020-09-29',
# '2020-10-29', '2020-11-29', '2020-12-29', '2021-01-29',
# '2021-02-28', '2021-03-29', '2021-04-29', '2021-05-29'],
# dtype='datetime64[ns]', freq=None)
我正在尝试使用 pd.date_range 为 12 个月的滚动场景生成捕获该月第 2 天的日期列表。我不太清楚如何在文档中结合频率别名来实现这一点。下面是我所在的位置和输出。我想看看
['2020-05-02', '2020-04-02', '2020-03-02'...]
pd.date_range(end='2020-06-02',periods=12,freq=)
DatetimeIndex(['2020-05-22', '2020-05-23', '2020-05-24', '2020-05-25',
'2020-05-26', '2020-05-27', '2020-05-28', '2020-05-29',
'2020-05-30', '2020-05-31', '2020-06-01', '2020-06-02'],
dtype='datetime64[ns]', freq='D')
你能试试这个吗?假设您的 df
有日期
df.sort_index(inplace=True)
df.groupby(pd.TimeGrouper('M')).nth(2) #This is to get the second day
我假设你已经定义了:
- 结束日期,
- 期数,
如您在代码示例中所写。
要构建日期范围,请使用:
- date_range MS(月开始)频率,
- 结合 shift 1 天。
执行此操作的代码是:
rng = pd.date_range(end='2020-06-02', periods=12, freq='MS').shift(1, freq='D')
给予:
DatetimeIndex(['2019-07-02', '2019-08-02', '2019-09-02', '2019-10-02',
'2019-11-02', '2019-12-02', '2020-01-02', '2020-02-02',
'2020-03-02', '2020-04-02', '2020-05-02', '2020-06-02'],
dtype='datetime64[ns]', freq=None)
这次freq是None意思:没有"frequency acronym" 每个月从每月的第二天开始(有首字母缩写词 月开始和月结束),但生成的日期肯定是 如你所愿
您可以使用 pd.offsets.DateOffset
which implements the logic of relativedelta。它没有矢量化,所以使用简单的列表理解来获取日期。
import pandas as pd
date = pd.to_datetime('June 2, 2020')
pd.Index([date + pd.offsets.DateOffset(months=i) for i in range(12)])
#DatetimeIndex(['2020-06-02', '2020-07-02', '2020-08-02', '2020-09-02',
# '2020-10-02', '2020-11-02', '2020-12-02', '2021-01-02',
# '2021-02-02', '2021-03-02', '2021-04-02', '2021-05-02'],
# dtype='datetime64[ns]', freq=None)
如果您需要处理接近月底的日期,此方法会更安全一些。 2 月没有 29 天,但 pd.offsets.Dateoffset
的逻辑可以做到,所以我们仍然有 2 月的最后一个日期。
date = pd.to_datetime('June 29, 2020')
pd.Index([date + pd.offsets.DateOffset(months=i) for i in range(12)])
#DatetimeIndex(['2020-06-29', '2020-07-29', '2020-08-29', '2020-09-29',
# '2020-10-29', '2020-11-29', '2020-12-29', '2021-01-29',
# '2021-02-28', '2021-03-29', '2021-04-29', '2021-05-29'],
# dtype='datetime64[ns]', freq=None)