увеличивая начальную дату на час, пока она не достигнет конечной даты - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть такой диапазон дат:

start_date ='2018-01-01T00:00:00'
end_date ='2018-01-31T23:59:59'

Преобразован в объекты:

start_date_object = datetime.strptime(start_date, '%Y-%m-%dT%H:%M:%S')
end_date_object = datetime.strptime(end_date, '%Y-%m-%dT%H:%M:%S')

Я пытаюсь написать функцию, которая примет дату начала и увеличит еена 1 час, пока он не достигнет конечной даты, например:

def daterange(start,end):
    while start <= end :
        start = start + timedelta(hours=1)
        print

daterange(start_date_object,end_date_object)

Но в настоящее время мой вывод таков:

2018-01-01 00:00:00
2018-01-01 01:00:00
2018-01-01 01:00:00

Я ожидал, что это сделает

2018-01-01 00:00:00
2018-01-01 01:00:00
2018-01-01 02:00:00
...
..
2018-01-31 23:59:59

Я неправильно использую дельта времени?

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Попробуйте это:

import datetime

start_date ='2018-01-01T00:00:00'
end_date ='2018-01-31T23:59:59'
start = datetime.datetime.strptime(start_date, '%Y-%m-%dT%H:%M:%S')
end = datetime.datetime.strptime(end_date, '%Y-%m-%dT%H:%M:%S')
while start<end: 
    start += datetime.timedelta(hours=1)
    print(start) 

Результат:

2018-01-01 01:00:00
2018-01-01 02:00:00
2018-01-01 03:00:00
2018-01-01 04:00:00
2018-01-01 05:00:00
.
.
.
2018-01-31 21:00:00
2018-01-31 22:00:00
2018-01-31 23:00:00
2018-02-01 00:00:00
0 голосов
/ 27 февраля 2019

pandas имеет отличную функциональность под названием date_range:

import pandas as pd

start_date ='2018-01-01T00:00:00'
end_date ='2018-01-31T23:59:59'
pd.date_range(start_date, end_date, freq='1h')
DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 01:00:00',
               '2018-01-01 02:00:00', '2018-01-01 03:00:00',
               '2018-01-01 04:00:00', '2018-01-01 05:00:00',
               '2018-01-01 06:00:00', '2018-01-01 07:00:00',
               '2018-01-01 08:00:00', '2018-01-01 09:00:00',
               ...
               '2018-01-31 14:00:00', '2018-01-31 15:00:00',
               '2018-01-31 16:00:00', '2018-01-31 17:00:00',
               '2018-01-31 18:00:00', '2018-01-31 19:00:00',
               '2018-01-31 20:00:00', '2018-01-31 21:00:00',
               '2018-01-31 22:00:00', '2018-01-31 23:00:00'],
              dtype='datetime64[ns]', length=744, freq='H')
0 голосов
/ 27 февраля 2019

Вам нужно инициализировать переменную end_date_object, используя end_date вместо start_date, т. Е.

end_date_object = datetime.strptime(end_date, '%Y-%m-%dT%H:%M:%S')

Кроме того, чтобы получить 2018-01-31 23:59:59 для последней строки, которую необходимо использовать < вместо <= в цикле while, а затем вычтите 1 секунду из start, прежде чем печатать его в последний раз вне цикла while:

Полный фиксированный код:

from datetime import datetime
from datetime import timedelta

def daterange(start, end):
  while start < end:
    print(start)
    start += timedelta(hours=1)
  print(start - timedelta(seconds=1)) # To get the XX:XX:59:59 for the last line

start_date ='2018-01-01T00:00:00'
end_date ='2018-01-31T23:59:59'

start_date_object = datetime.strptime(start_date, '%Y-%m-%dT%H:%M:%S')
end_date_object = datetime.strptime(end_date, '%Y-%m-%dT%H:%M:%S')

daterange(start_date_object, end_date_object)

Выход:

2018-01-01 01:00:00
2018-01-01 02:00:00
2018-01-01 03:00:00
2018-01-01 04:00:00
2018-01-01 05:00:00
2018-01-01 06:00:00
2018-01-01 07:00:00
2018-01-01 08:00:00
2018-01-01 09:00:00
2018-01-01 10:00:00
.
.
.
2018-01-31 20:00:00
2018-01-31 21:00:00
2018-01-31 22:00:00
2018-01-31 23:00:00
2018-01-31 23:59:59
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...