在Python中获取一段时间范围

7

我正在制作一个日程应用程序,需要一种方法来为每个块分类一系列日期。日期被标记为整数:

星期一,星期二,星期三,星期四,星期五,星期六,星期天 分别对应 0, 1, 2, 3, 4, 5, 6

假设我安排了一个从星期二开始到星期五结束的时间块。识别其范围很容易:

range(block.start_day, block.end_day +1) 将给出 (1, 4)

但是如果块从星期六开始,到星期三结束,则无法使用上述方法。

我需要的结果是 (5, 6, 0, 1, 2)

我有些困惑。我想我可以使用模运算符,但我不确定。

** 编辑 ** 抱歉,我已更新正确的期望输出。

使用Python 2.7.6


1
一个范围可以超过一周吗?如果可以,你如何预期处理它? - Scott Hunter
@ScottHunter 不行,范围不能超过一周。 - Saša Kalaba
你在使用Python 2还是3?在Python 2中,range是一个列表,但在Python 3中它是一个迭代器,这可能会影响你的解决方案。 - Empiromancer
1
你考虑过使用pandas吗?http://pandas.pydata.org/pandas-docs/stable/timeseries.html - Dror
我认为可以使用 itertools.cycleitertools.islice 来优雅地完成它。 - JulienD
5个回答

2

您可以使用条件逻辑来解决问题:

def get_range(start_day, end_day):
    if (start_day < end_day):
        r = range(start_day, end_day + 1)
    else:
        r1 = range(start_day, 7)
        r2 = range(0, end_day + 1)
        r = r1 + r2
    return r

我相信这里的某个人可以提供更加优雅的解决方案,但这个方法可以让你开始。为了充分起见,我认为在Python 3 中可以使用 itertools.chain 替代 + 连接 r1 和 r2(其中 range 生成迭代器而不是列表)。

2

处理奇怪范围的一种方法是实现自定义范围函数:

def date_range(start, end):
    'Return a list of weekday values in the range [START, END]'
    names = dict(zip(
        ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'],
        range(7)))
    try:
        start = names[start.upper()]
    except:
        pass
    try:
        end = names[end.upper()]
    except:
        pass
    while True:
        yield start % 7
        if start % 7 == end % 7:
            return
        start += 1

print list(date_range('tue', 'fri'))
print list(date_range('sat', 'wed'))
print list(date_range(5, 2))

结果:

[1, 2, 3, 4]
[5, 6, 0, 1, 2]
[5, 6, 0, 1, 2]

2
def days(f, L):
    if f > L:
        x = list(range(0, 7))
        return x[f:] + x[:L+1]
    else:
        return list(range(f, L+1))

days(5, 3) 返回 [5, 6, 0, 1, 2, 3]

days(3, 5) 返回 [3, 4, 5]


这段代码涉及到计算日期,其中第一个参数代表起始日期,第二个参数代表长度。返回的数组包含了从起始日期开始指定天数的所有日期。

0

这是我的解决方案:

def get_range(f):
    week = list(range(7))
    if f[1] < f[0]:
        _curr = week[f[0]:]
        _rest = week[:f[1]+1]
        return _curr+_rest
    else:
        return range(f[0],f[1]+1)

结果:

get_range([1,4]) -> [1, 2, 3, 4]
get_range([5,2]) -> [5, 6, 0, 1, 2]

get_range([4,1]) 会产生什么结果?另外,x 没有被定义。 - Robᵩ

0

你可以使用这个函数:

def getrange(start,end):
    result = [start]
    week = [0, 1, 2, 3, 4, 5, 6]
    c = start
    while (week[c%7] != end):
        c = c + 1
        result.append(week[c%7])
    return result

测试用例:

getrange(1,4) =>[1,2,3,4]
getrange(5,2) =>[5,6,0,1,2]

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