生成 start 和 end 之间的全部季度点列表
def gen_all_quarters(start: datetime.datetime, end: datetime.datetime):
"""
生成 start 和 end 之间全部季度时间点列表
:param start:
:param end:
:return:
"""
idx = pd.date_range(start=start, end=end, freq="Q")
# res = [dt.strftime("%Y-%m-%d %H:%M:%S") for dt in idx]
dt_list = [dt.to_pydatetime() for dt in idx]
return dt_list
生成两个时间点之间的全部季度末时间点列表
def gen_q_last_day_list(start: datetime.datetime, end: datetime.datetime, q):
"""
获取两个时间点之间包含的所有某一季度末时间点列表
:param start:
:param end:
:param q:
:return:
"""
# first method
# quarter_map = {
# 1: (3, 31),
# 2: (6, 30),
# 3: (9, 30),
# 4: (12, 31)
# }
# _month, _day = quarter_map.get(q)
#
# start_date = datetime.datetime.combine(start.date(), datetime.time.min)
# end_date = datetime.datetime.combine(end.date(), datetime.time.max)
#
# date_list = list()
#
# start_year = start_date.year
# s = datetime.datetime(start_year, _month, _day, 0, 0, 0)
# if start_date <= s:
# date_list.append(s)
#
# end_year = end_date.year
# e = datetime.datetime(end_year, _month, _day, 0, 0, 0)
# if end_date >= e:
# date_list.append(e)
#
# middle_year = start_year + 1
# while middle_year < end_year:
# m = datetime.datetime(middle_year, _month, _day, 0, 0, 0)
# date_list.append(m)
# middle_year += 1
# return sorted(date_list)
# second method
# start = str(start.year) + "Q" + str(q)
# res = pd.date_range(start, end, freq="4Q")
# return res
# third method
start = str(start.year) + "Q" + str(q)
_map = {
1: "4Q-DEC", # 第四季度从 12 月开始
2: "4Q-MAR", # 第二季度从 3 月开始
3: "4Q-JUN", # 第三季度从 6 月开始
4: "4Q-SEP", # 第四季度从 9 月开始
}
# 在 freq 中可以规定生成以什么时候开始的财年的数据
dts = pd.date_range(start, end, freq=_map.get(q))
dt_list = [dt.to_pydatetime() for dt in dts]
return dt_list
生成当前时间点之前的最近的一个季度时间点
def gen_one_quarter_before(dt: datetime.datetime):
"""
生成当前时间点之前的第一个季度时间点
比如 2011.2.1 之前最近的一个季度时间点是 2010.12.31
:param dt:
:return:
"""
# # first method
# this_year = dt.year
# q1 = datetime.datetime(this_year, 3, 31, 0, 0, 0)
# q2 = datetime.datetime(this_year, 6, 30, 0, 0, 0)
# q3 = datetime.datetime(this_year, 9, 30, 0, 0, 0)
# q4 = datetime.datetime(this_year, 12, 31, 0, 0, 0)
# if dt >= q4:
# return q4
# elif dt >= q3:
# return q3
# elif dt >= q2:
# return q2
# elif dt >= q1:
# return q1
# else: # dt < q1
# return datetime.datetime(this_year - 1, 12, 31, 0, 0, 0)
# second method
dt = pd.date_range(start=None, end=dt, periods=1, freq="Q")[0].to_pydatetime()
return dt
测试一下
if __name__ == "__main__":
# test gen_all_quarters
s = datetime.datetime(2010, 1, 2)
e = datetime.datetime(2013, 6, 7)
r1 = gen_all_quarters(s, e)
print(r1)
# test gen one quarter before
r2 = gen_one_quarter_before(s)
print(r2, type(r2))
# test gen_q_last_day_list
# r3 = gen_q_last_day_list(s, e, 1)
# r3 = gen_q_last_day_list(s, e, 2)
# r3 = gen_q_last_day_list(s, e, 3)
r3 = gen_q_last_day_list(s, e, 4)
print(r3)