从Python的datetime对象中获取年份和季度

4

我有一个需求,需要根据给定的日期找到已完成的季度(从一月到十二月的1到4),请注意,这不是当前的季度,而是已经完成的季度。也就是说,如果输入日期是1月1日,则已完成的季度为4而不是1。以下是我拥有的小代码片段:

>>> import datetime
>>> import math
>>> now = datetime.datetime(2015, 1, 1, 0, 0, 0, 0)
>>> present_quarter = int(math.ceil(now.month/3.))
>>> completed_quarter = (present_quarter - 1) if present_quarter != 1 else 4
>>> completed_quarter
4

然而,我需要年份,以便输出为:
2014-4

什么是最好的方法?输出是否可以保持为datetime对象而不是字符串,我的意思是Python是否支持类似于年-季度的datetime对象。
3个回答

5
您可以将月份简单映射到季度和年份差(Q4需要去年的数据):
def completed_quarter(dt):
    prev_quarter_map = ((4, -1), (1, 0), (2, 0), (3, 0))
    quarter, yd = prev_quarter_map[(dt.month - 1) // 3]
    return (dt.year + yd, quarter)

这将月份转换为0到3之间的值,然后将其转换为季度号和年增量。将年增量加到当前年份,即可得到上一个季度的正确年份。

演示:

>>> def completed_quarter(dt):
...     prev_quarter_map = ((4, -1), (1, 0), (2, 0), (3, 0))
...     quarter, yd = prev_quarter_map[(dt.month - 1) // 3]
...     return (dt.year + yd, quarter)
... 
>>> from datetime import date
>>> completed_quarter(date(2015, 1, 12))
(2014, 4)
>>> completed_quarter(date(2015, 8, 31))
(2015, 2)
>>> completed_quarter(date(2015, 12, 31))
(2015, 3)

datetime 模块没有可以模拟季度的对象;你只能有一个日期(必须具有有效的年、月和日值)或一个日期和时间(添加一个有效的小时、分钟、秒和微秒值,以及可选的时区)。


@Martin,只是想了解一下,最终结果是否可以是一个日期对象,以便我可以对其执行标准日期操作? - Amistad
@Amistad:除非你将其转换为该季度的具体日期,否则不行。日期对象只能模拟实际日期,即具有年、月和日值的东西。 - Martijn Pieters
@Amistad:例如,一个季度的第一天是date(year, ((quarter - 1) * 3) + 1, 1) - Martijn Pieters

2
你只需要抓住第一季度:
def qrt(now):
    first_qrt = now.month < 4
    return now.year - first_qrt, (now.month - 1) // 3 if not first_qrt else 4

但是只是为了理解...现在.年-真 = 2014,现在.年-假 = 2015...这背后的逻辑是什么? - Amistad

1
如何扩展日期时间?
class Quarter(datetime):
    def __init__(self, *args, **kwargs):
        super(Quarter, self).__init__(*args, **kwargs)
        present_quarter = int(math.ceil(self.month/3))
        self.quarter = (present_quarter-1) if present_quarter != 1 else 4

使用它。
q = Quarter(2015,1,1,0,0,0)
# Or
q = Quarter.now()
# Getting quarter
print q.quarter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接