Creating a range of dates in Python

后端 未结 20 2069
栀梦
栀梦 2020-11-22 11:02

I want to create a list of dates, starting with today, and going back an arbitrary number of days, say, in my example 100 days. Is there a better way to do it than this?

相关标签:
20条回答
  • 2020-11-22 11:35

    Here is gist I created, from my own code, this might help. (I know the question is too old, but others can use it)

    https://gist.github.com/2287345

    (same thing below)

    import datetime
    from time import mktime
    
    def convert_date_to_datetime(date_object):
        date_tuple = date_object.timetuple()
        date_timestamp = mktime(date_tuple)
        return datetime.datetime.fromtimestamp(date_timestamp)
    
    def date_range(how_many=7):
        for x in range(0, how_many):
            some_date = datetime.datetime.today() - datetime.timedelta(days=x)
            some_datetime = convert_date_to_datetime(some_date.date())
            yield some_datetime
    
    def pick_two_dates(how_many=7):
        a = b = convert_date_to_datetime(datetime.datetime.now().date())
        for each_date in date_range(how_many):
            b = a
            a = each_date
            if a == b:
                continue
            yield b, a
    
    0 讨论(0)
  • 2020-11-22 11:36

    Marginally better...

    base = datetime.datetime.today()
    date_list = [base - datetime.timedelta(days=x) for x in range(numdays)]
    
    0 讨论(0)
  • 2020-11-22 11:38

    Based on answers I wrote for myself this:

    import datetime;
    print [(datetime.date.today() - datetime.timedelta(days=x)).strftime('%Y-%m-%d') for x in range(-5, 0)]
    

    Output:

    ['2017-12-11', '2017-12-10', '2017-12-09', '2017-12-08', '2017-12-07']
    

    The difference is that I get the 'date' object, not the 'datetime.datetime' one.

    0 讨论(0)
  • 2020-11-22 11:39

    A bit of a late answer I know, but I just had the same problem and decided that Python's internal range function was a bit lacking in this respect so I've overridden it in a util module of mine.

    from __builtin__ import range as _range
    from datetime import datetime, timedelta
    
    def range(*args):
        if len(args) != 3:
            return _range(*args)
        start, stop, step = args
        if start < stop:
            cmp = lambda a, b: a < b
            inc = lambda a: a + step
        else:
            cmp = lambda a, b: a > b
            inc = lambda a: a - step
        output = [start]
        while cmp(start, stop):
            start = inc(start)
            output.append(start)
    
        return output
    
    print range(datetime(2011, 5, 1), datetime(2011, 10, 1), timedelta(days=30))
    
    0 讨论(0)
  • 2020-11-22 11:39

    Matplotlib related

    from matplotlib.dates import drange
    import datetime
    
    base = datetime.date.today()
    end  = base + datetime.timedelta(days=100)
    delta = datetime.timedelta(days=1)
    l = drange(base, end, delta)
    
    0 讨论(0)
  • 2020-11-22 11:40

    You can write a generator function that returns date objects starting from today:

    import datetime
    
    def date_generator():
      from_date = datetime.datetime.today()
      while True:
        yield from_date
        from_date = from_date - datetime.timedelta(days=1)
    

    This generator returns dates starting from today and going backwards one day at a time. Here is how to take the first 3 dates:

    >>> import itertools
    >>> dates = itertools.islice(date_generator(), 3)
    >>> list(dates)
    [datetime.datetime(2009, 6, 14, 19, 12, 21, 703890), datetime.datetime(2009, 6, 13, 19, 12, 21, 703890), datetime.datetime(2009, 6, 12, 19, 12, 21, 703890)]
    

    The advantage of this approach over a loop or list comprehension is that you can go back as many times as you want.

    Edit

    A more compact version using a generator expression instead of a function:

    date_generator = (datetime.datetime.today() - datetime.timedelta(days=i) for i in itertools.count())
    

    Usage:

    >>> dates = itertools.islice(date_generator, 3)
    >>> list(dates)
    [datetime.datetime(2009, 6, 15, 1, 32, 37, 286765), datetime.datetime(2009, 6, 14, 1, 32, 37, 286836), datetime.datetime(2009, 6, 13, 1, 32, 37, 286859)]
    
    0 讨论(0)
提交回复
热议问题