将日期范围拆分为相等的子范围,剩余时间分配给las

2024-06-28 19:44:40 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种更优雅的/Python式的方法来完成标题所说的和这个函数所做的?在

def split_datetime_range(start, end, split):
    """Splits a range of dates into a list of equal ranges
    with remaining time allocated to the last of the series.
    This function doesn't overlap dates, so seconds are lost
    inbetween each range

    Parameters:
      start - The start of the range
      end - The end of the range
      split - How many ranges to produce

    Returns:
      A list of tuples, each tuple is its own range
    """
    total_seconds = int((end - start).total_seconds())
    delta = total_seconds / split
    starts = [start + timedelta(seconds=delta * i) for i in range(split)]
    ends = [s + timedelta(seconds=delta - 1) for s in starts]
    ends[len(ends) - 1] = end
    return zip(starts, ends)

编辑-

一个限制是它必须是“秒”分辨率,而不是“微秒”分辨率。其思想是生成一个日期范围列表,以提供给接受iso8601中具有秒分辨率的日期的web服务


Tags: ofthe分辨率rangestartlistendtotal
2条回答

你提到了itertools-所以这里有一些你可以玩的东西-但是没有测试过:

from datetime import datetime
from itertools import count, islice

def datetime_range(start, end, number):
    start_secs = (start - datetime(1970, 1, 1)).total_seconds()
    end_secs = (end - datetime(1970, 1, 1)).total_seconds()
    dates = [datetime.fromtimestamp(el) for el in islice(count(start_secs, (end_secs - start_secs) / number), number + 1)]
    return zip(dates, dates[1:])

print datetime_range(datetime(2012, 1, 1), datetime(2012, 1, 30), 10)

我不确定这是否符合你的要求。在

>>> from datetime import *
>>> end = datetime.now()
>>> start = end - timedelta(30)
>>> start
datetime.datetime(2013, 6, 17, 18, 35, 17, 353000)
>>> end
datetime.datetime(2013, 7, 17, 18, 35, 17, 353000)
>>> d = (end- start) / 7
>>> d
datetime.timedelta(4, 24685, 714285)
>>> [(i * d + start, (i+1)*d+start) for i in range(7)]
[(datetime.datetime(2013, 6, 17, 18, 35, 17, 353000), datetime.datetime(2013, 6,
22, 1, 26, 43, 67285)), (datetime.datetime(2013, 6, 22, 1, 26, 43, 67285), date
time.datetime(2013, 6, 26, 8, 18, 8, 781570)), (datetime.datetime(2013, 6, 26, 8
, 18, 8, 781570), datetime.datetime(2013, 6, 30, 15, 9, 34, 495855)), (datetime.
datetime(2013, 6, 30, 15, 9, 34, 495855), datetime.datetime(2013, 7, 4, 22, 1, 0
, 210140)), (datetime.datetime(2013, 7, 4, 22, 1, 0, 210140), datetime.datetime(
2013, 7, 9, 4, 52, 25, 924425)), (datetime.datetime(2013, 7, 9, 4, 52, 25, 92442
5), datetime.datetime(2013, 7, 13, 11, 43, 51, 638710)), (datetime.datetime(2013
, 7, 13, 11, 43, 51, 638710), datetime.datetime(2013, 7, 17, 18, 35, 17, 352995)
)]
>>>

如果您希望iso格式不包含毫秒,请给定日期时间对象“now”:

^{pr2}$

相关问题 更多 >