在Pandas中,我知道您可以使用锚点偏移来指定更复杂的reucrrence: http://pandas.pydata.org/pandas-docs/stable/timeseries.html#anchored-offset
我想指定一个date_range,使其在每个月的第n天按月计算。使用它的最佳语法是什么?我正在对类似于此的内容进行成像,该内容指定周五每两周发生一次复发:
schedule = pd.date_range(start=START_STR, periods=26, freq="2W-FRI")
答案 0 :(得分:5)
IIUC你可以这样做:
In [18]: pd.DataFrame(pd.date_range('2016-01-01', periods=10, freq='MS') + pd.DateOffset(days=26), columns=['Date'])
Out[18]:
Date
0 2016-01-27
1 2016-02-27
2 2016-03-27
3 2016-04-27
4 2016-05-27
5 2016-06-27
6 2016-07-27
7 2016-08-27
8 2016-09-27
9 2016-10-27
更新:以计算月份和闰年的不同天数:
def month_range(start, periods=12):
rng = pd.date_range(pd.Timestamp(start)-pd.offsets.MonthBegin(),
periods=periods,
freq='MS')
ret = (rng + pd.offsets.Day(pd.Timestamp(start).day-1)).to_series()
ret.loc[ret.dt.month > rng.month] -= pd.offsets.MonthEnd(1)
return pd.DatetimeIndex(ret)
示例:
In [202]: month_range('2016-01-27', 12)
Out[202]:
DatetimeIndex(['2016-01-27', '2016-02-27', '2016-03-27', '2016-04-27', '2016-05-27', '2016-06-27', '2016-07-27', '2016-08-27',
'2016-09-27', '2016-10-27', '2016-11-27', '2016-12-27'],
dtype='datetime64[ns]', freq=None)
In [203]: month_range('2020-01-31', 12)
Out[203]:
DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30', '2020-05-31', '2020-06-30', '2020-07-31', '2020-08-31',
'2020-09-30', '2020-10-31', '2020-11-30', '2020-12-31'],
dtype='datetime64[ns]', freq=None)
In [204]: month_range('2019-01-29', 12)
Out[204]:
DatetimeIndex(['2019-01-29', '2019-02-28', '2019-03-29', '2019-04-29', '2019-05-29', '2019-06-29', '2019-07-29', '2019-08-29',
'2019-09-29', '2019-10-29', '2019-11-29', '2019-12-29'],
dtype='datetime64[ns]', freq=None)
答案 1 :(得分:1)
编辑:最初接受的答案并没有说明月份和leap年的不同天数。这里仍然是解决问题的替代功能:
import pandas as pd
def month_range_day(start=None, periods=None):
start_date = pd.Timestamp(start).date()
month_range = pd.date_range(start=start_date, periods=periods, freq='M')
month_day = month_range.day.values
month_day[start_date.day < month_day] = start_date.day
return pd.to_datetime(month_range.year*10000+month_range.month*100+month_day, format='%Y%m%d')
示例1 :
start_date = '2020-01-31'
month_range_day(start=start_date, periods=12)
输出:
DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30',
'2020-05-31', '2020-06-30', '2020-07-31', '2020-08-31',
'2020-09-30', '2020-10-31', '2020-11-30', '2020-12-31'],
dtype='datetime64[ns]', freq=None)
示例2:
start_date = '2019-01-29'
month_range_day(start=start_date, periods=12)
输出:
DatetimeIndex(['2019-01-29', '2019-02-28', '2019-03-29', '2019-04-29',
'2019-05-29', '2019-06-29', '2019-07-29', '2019-08-29',
'2019-09-29', '2019-10-29', '2019-11-29', '2019-12-29'],
dtype='datetime64[ns]', freq=None)