从 Pandas 时间戳中查找下一个 Quarter/Month/Year/Bi-annual 日期

Find next Quarter/Month/Year/Bi-annual Date from Pandas Timestamp

我想找到一种方法,可以在给定 Pandas 时间戳的情况下为我提供下一个 month/quarter/year/bi-annual 日期。

如果时间戳已经是 month/quarter/year/bi-annual 日期的结尾,那么我可以获得下一个季度日期,如下所示:

pd.Timestamp('1999-12-31') + pd.tseries.offsets.DateOffset(months=3)

如果时间戳是 pd.Timestamp('1999-12-30'),上面的方法将不起作用。

预期输出

input = pd.Timestamp('1999-12-30')
next_quarter_end = '2000-03-31'
next_month_end = '2000-01-31'
next_year_end = '2000-12-31'
next_biannual_end = '2000-06-30'

从技术上讲,Timestamp('1999-12-30') 之后的下一个季度末是 Timestamp('1999-12-31 00:00:00')

您可以使用pandas.tseries.offsets.QuarterEnd

>>> pd.Timestamp('1999-12-30') + pd.tseries.offsets.QuarterEnd()
Timestamp('1999-12-31 00:00:00')

>>> pd.Timestamp('1999-12-30') + pd.tseries.offsets.QuarterEnd()*2
Timestamp('2000-03-31 00:00:00')

同样,使用pandas.tseries.offsets.MonthEnd()pandas.tseries.offsets.YearEnd()

对于一年两次,我想你可以接受 2*QuarterEnd()

这行得通。我使用 pandas.tseries.offsets.QuarterEnd, .MonthEnd, and .YearEnd,乘以根据输入而变化的特定因子,以获得您正在寻找的四个值。

date = pd.Timestamp('1999-12-31')
month_factor = 1 if date.day == date.days_in_month else 2
year_factor = 1 if date.day == date.days_in_month and date.month == 12 else 2
next_month_end = date + pd.tseries.offsets.MonthEnd() * month_factor
next_quarter_end = date + (pd.tseries.offsets.QuarterEnd() * month_factor)
next_year_end = date + pd.tseries.offsets.YearEnd() * year_factor
next_biannual_end = date + pd.tseries.offsets.DateOffset(months=6)