Iterating through a range of dates in Python

后端 未结 23 1586
醉酒成梦
醉酒成梦 2020-11-22 04:40

I have the following code to do this, but how can I do it better? Right now I think it\'s better than nested loops, but it starts to get Perl-one-linerish when you have a ge

23条回答
  •  挽巷
    挽巷 (楼主)
    2020-11-22 05:02

    Here's code for a general date range function, similar to Ber's answer, but more flexible:

    def count_timedelta(delta, step, seconds_in_interval):
        """Helper function for iterate.  Finds the number of intervals in the timedelta."""
        return int(delta.total_seconds() / (seconds_in_interval * step))
    
    
    def range_dt(start, end, step=1, interval='day'):
        """Iterate over datetimes or dates, similar to builtin range."""
        intervals = functools.partial(count_timedelta, (end - start), step)
    
        if interval == 'week':
            for i in range(intervals(3600 * 24 * 7)):
                yield start + datetime.timedelta(weeks=i) * step
    
        elif interval == 'day':
            for i in range(intervals(3600 * 24)):
                yield start + datetime.timedelta(days=i) * step
    
        elif interval == 'hour':
            for i in range(intervals(3600)):
                yield start + datetime.timedelta(hours=i) * step
    
        elif interval == 'minute':
            for i in range(intervals(60)):
                yield start + datetime.timedelta(minutes=i) * step
    
        elif interval == 'second':
            for i in range(intervals(1)):
                yield start + datetime.timedelta(seconds=i) * step
    
        elif interval == 'millisecond':
            for i in range(intervals(1 / 1000)):
                yield start + datetime.timedelta(milliseconds=i) * step
    
        elif interval == 'microsecond':
            for i in range(intervals(1e-6)):
                yield start + datetime.timedelta(microseconds=i) * step
    
        else:
            raise AttributeError("Interval must be 'week', 'day', 'hour' 'second', \
                'microsecond' or 'millisecond'.")
    

提交回复
热议问题