使用 pandas 中的方法生成季度点数据

生成 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)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值