按季度生成时间序列,增加一个季度



我看了arrow和python文档,似乎没有任何按季度递增的步骤。例如,下面的代码以增量方式给出月份,给定到目前为止的起始月份。查看arrow文档,月末方便。有什么按季度做的吗?

import arrow
from datetime import datetime
a=arrow.Arrow.span_range('month', datetime(2012,7,1,0,0),datetime.now() )
for i in a:
    print i[1].floor('day').datetime.strftime("%Y-%m-%d")

到目前为止,我正在寻找一个循序渐进的解决方案

输入:14Q3

输出:

14Q3
14Q4
15Q1
15Q2
15Q3

获取当前季度,使用:(month - 1) // 3 + 1。生成给定范围内的四分之一:

from datetime import date
def generate_quarters(start, end):
    while start < end: #NOTE: not including *end*
        yield start
        start = start.increment()
start = Quarter.from_string('14Q3')
end = Quarter.from_date(date.today())
print("n".join(map(str, generate_quarters(start, end))))

其中Quarter是一个简单的namedtuple子类:

from collections import namedtuple
class Quarter(namedtuple('Quarter', 'year quarter')):
    __slots__ = ()
    @classmethod
    def from_string(cls, text):
        """Convert 'NQM' into Quarter(year=2000+N, quarter=M)."""
        year, quarter = map(int, text.split('Q'))
        return cls(year + 2000, quarter)
    @classmethod
    def from_date(cls, date):
        """Create Quarter from datetime.date instance."""
        return cls(date.year, (date.month - 1) // 3 + 1)
    def increment(self):
        """Return the next quarter."""
        if self.quarter < 4:
            return self.__class__(self.year, self.quarter + 1)
        else:
            assert self.quarter == 4
            return self.__class__(self.year + 1, 1)
    def __str__(self):
        """Convert to "NQM" text representation."""
        return "{year}Q{quarter}".format(year=self.year-2000, quarter=self.quarter)

输出
14Q3
14Q4
15Q1
15Q2
15Q3

不包括当前季度(15Q4)。

不好看但好用

import arrow
from datetime import datetime
a=arrow.Arrow.span_range('month', datetime(2012,7,1,0,0),datetime.now() )
for i in a:
    print i[1].floor('day').datetime.strftime("%Y-%m-%d")
b=[(x[1].date().month-1)//3 for x in a]
c=[]
for i in range(0,len(b),3):
    c.append(str(a[i][1].year)[2:]+"Q"+str(b[i]))

最新更新