#python #datetime #for-loop #if-statement #pycharm
#python #дата и время #для цикла #оператор if #pycharm
Вопрос:
Я новичок в Python, и мне трудно фильтровать запрос API по дате и времени: завтра, в основном, только с 0100-2400 часов. Часовой пояс — это местное время. Запрос выводится в виде вложенного словаря, и я смог отфильтровать его до ‘ValidTime’, но оттуда он больше не фильтруется. Мои start_time и end_time могут быть неправильными, или мой оператор if может быть неправильным, или это что-то еще. Я чувствую, что это легко исправить, я просто не могу в этом разобраться. Пожалуйста, помогите. Мой код приведен ниже:
import constants
import requests
import datetime
import json
today = datetime.date.today()
yesterday = today - datetime.timedelta(days=1)
tomorrow = today datetime.timedelta(days=1)
day_after_tomorrow = today datetime.timedelta(days=2)
hour1 = datetime.time(1, 0, 0)
hour0 = datetime.time(0, 0, 0)
start_time = ['{}T{} 00:00/PT1H'.format(tomorrow, hour1)]
end_time = ['{}T{} 00:00/PT1H'.format(day_after_tomorrow, hour0)]
response = requests.get(constants.austinfgd, headers=headers)
data = json.loads(response.text)
temperature_data = data['properties']['temperature']['values']
print(temperature_data)
Это то, что распечатывается на данный момент:
Напечатанный ответ на temperature_data с веб-сайта
[{'validTime': '2020-12-11T10:00:00 00:00/PT2H', 'value': 17.77777777777778},
{'validTime': '2020-12-11T12:00:00 00:00/PT1H', 'value': 16.666666666666668},
{'validTime': '2020-12-11T13:00:00 00:00/PT2H', 'value': 17.22222222222222},
...
и так далее в течение нескольких дней
Итак, теперь мне нужно отфильтровать по validTime
, и я специально хочу, чтобы часы = до и между start_time и end_time. Итак, вот мой код для этого:
for v in temperature_data:
if ['validTime'] >= start_time and ['validTime'] <= end_time:
На данный момент pycharm говорит мне упростить цепное сравнение, и это автоматически дает мне это:
for v in temperature_data:
if start_time <= ['validTime'] <= end_time:
print(v)
На данный момент единственное, что выводится, это:
Напечатанный ответ на v
Процесс завершен с кодом выхода 0
Мне нужно напечатать эти значения только к этому времени, чтобы я мог выполнить сброс в таблицу в postgresql для использования в другом месте.
Что я делаю не так? Я гуглил это больше недели, и я сдаюсь. Время просить о помощи, пожалуйста, помогите. Заранее благодарю вас за вашу помощь.
Итак, я все изменил, и это, похоже, сработало. Не уверен, есть ли лучший способ закодировать это. И я не понимаю, зачем мне нужно иметь v[‘ValidTime’] в операторе if . Есть ли более чистый способ сделать это?
tomorrow = datetime.datetime.combine(
datetime.date.today() datetime.timedelta(days=1),
datetime.time(1, 0, 0),
tzinfo=pytz.UTC
)
day_after_tomorrow = datetime.datetime.combine(
datetime.date.today() datetime.timedelta(days=2),
datetime.time(1, 0, 0),
tzinfo=pytz.UTC
)
start_time = tomorrow.isoformat()
end_time = day_after_tomorrow.isoformat()
response = requests.get(constants.austinfgd, headers=headers)
data = json.loads(response.text)
temperature_data = data['properties']['temperature']['values']
for v in temperature_data:
if start_time <= v['validTime'] <= end_time:
print(v)
Комментарии:
1. Это должно быть
v['validTime']
, а не['validTime']
2. Я только что попробовал, и теперь у меня ошибка: трассировка (последний последний вызов): File «C:/Users/todds/Desktop/Ferg Питон Projects/weather/login.py «, строка 55, в <модуле>, если start_time <= v[‘ValidTime’] <= end_time: ошибка типа: ‘<=’ не поддерживается между экземплярами ‘list’и процесс ‘str’ завершен с кодом выхода 1
3. Да, я думаю, вам следует сравнивать объекты datetime, а не строки. и start_time end_time не должны быть массивом / списком.
4. Я не понимаю, что это значит. Не могли бы вы, пожалуйста, привести мне пример? Не могли бы вы привести мне пример того, как сделать start_time объектом?
5. Смогли ли вы решить эту проблему или все еще ищете ответ?