форматирование URL с начальной и конечной датой и временем с использованием Python

1

Я использую Pandas для создания списка дат и времени в пределах указанного диапазона, чтобы получить запрос API. Моя цель - запрашивать недели или месяцы в час.

time_range = pd.date_range('20180601T07:00:0000', '20180701T07:00:0000', freq='H')
time_range = time_range.strftime("%Y%m%d"+'T%H:00-0000')

выводит список раз в желаемом формате списка. Где я сталкиваюсь с трудностями, так это то, что URL-адрес отформатирован...

startdatetime=20180601T07:00-0000&enddatetime=20180601T08:00-0000

Я понимаю, что мне нужно начинать с значений 0 и 1 из списка Pandas, но я не знаю, как это сделать. Должен ли я думать о словаре, как...

{date1:[hour1, hour2, etc...], date2:[hour1, hour2, etc...], ...}

и используйте.format где startdatetime = {1} & enddatetime = {2}? или если он больше похож на цикл for...

for date in date_range:
    url = 'http://somename?startdatetime={date}&enddatetime{date2}'
    urldate = url.format(date=date)
    urldate2 = url.format(date2=date + 1)

Любая помощь приветствуется!

Теги:
python-3.x
datetime
url
date-formatting

1 ответ

1
Лучший ответ

Если я четко понимаю, вы хотите выполнить итерацию с начальной даты/времени (2018-06-01 07:00) до конечной даты/времени (2018-07-01 07:00) с шагом в один час. И создайте URL-адрес с интервалом даты/времени в течение одного часа.

Я не знаю, почему вы используете Panda для этого, когда можете сделать это со стандартной библиотекой, например:

import datetime

start = datetime.datetime(2018, 6, 1, 7)
end = datetime.datetime(2018, 7, 1, 7)
delta = datetime.timedelta(hours=1)

fmt = 'http://somename?startdatetime={date1:%Y%m%d%H:00-0000}&enddatetime{date2:%Y%m%d%H:00-0000}'

while start < end:
    date1 = start
    date2 = start + delta
    url = fmt.format(date1=date1, date2=date2)
    print(url)
    start = date2

Ты получаешь:

http://somename?startdatetime=2018060107:00-0000&enddatetime2018060108:00-0000
http://somename?startdatetime=2018060108:00-0000&enddatetime2018060109:00-0000
http://somename?startdatetime=2018060109:00-0000&enddatetime2018060110:00-0000
http://somename?startdatetime=2018060110:00-0000&enddatetime2018060111:00-0000
...

В цикле я работаю с экземплярами даты. Я использую строку формата, например "{date2:% Y% m% d% H: 00-0000}", чтобы форматировать дату и время в требуемом формате.

Обратите внимание, что функцию date_range() легко реализовать со стандартной библиотекой:

def date_range(start, end, delta):
    while start < end:
        yield start
        start = start + delta

Чтобы получить список дат с интервалом в один час, вы можете:

dates = list(date_range(
    datetime.datetime(2018, 6, 1, 7),
    datetime.datetime(2018, 7, 1, 7),
    datetime.timedelta(hours=1)))

Тогда решение становится:

fmt = 'http://somename?startdatetime={date1:%Y%m%d%H:00-0000}&enddatetime{date2:%Y%m%d%H:00-0000}'

for date1, date2 in zip(dates[:-1], dates[1:]):
    url = fmt.format(date1=date1, date2=date2)
    print(url)

Хитрость заключается в использовании функции zip() со списком дат, сдвинутых с одним элементом, чтобы получить пары дат.

  • 0
    Спасибо - это было именно то, что мне было нужно, я думаю, мне нужно понять timedelta
  • 0
    Есть ли преимущество в использовании zip-версии по сравнению с версией timedelta>
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню