не удается преобразовать строку в объект datetime в формате json без pandas?

#python #datetime

#python #datetime

Вопрос:

у меня есть json, где время находится в поле «createdAt». 'createdAt': '2020-10-17T02:56:51 0900'

Я хочу проанализировать время (которое является строкой) и преобразовать его в объект datetime, но я не понимаю, почему мой код не принимает указанный формат datetime и возвращает все мои createdAt раз с 0.

 for line in data:
    try:
        date_time_str = line['createdAt']
        date_time_obj = datetime.strptime(f'{str(date_time_str)}', "%Y-%m-%dT%H:%M:%S%z")
        line['createdAt'] = date_time_obj
    except ValueError:
        line['createdAt'] = 0
  

примечание: запрещено использовать dateutil

Комментарии:

1. Какую ошибку вы получаете / что работает не так, как ожидалось? Формат strptime выглядит отлично. Кроме того, достаточно просто ввести date_time_str strptime, нет необходимости в f-string str() .

2. Почему вы не можете использовать? dateutil Это что, домашнее задание?

3. @baduker: это все равно не нужно, как я это вижу, поэтому меня это не волнует 😉

4. @MrFuppes я получаю ‘createdAt’: 0 для всех случаев в моем json, поэтому по какой-то причине мой код переходит прямо к условию except

5. итак, что это data ?

Ответ №1:

Почему бы вам просто не сделать это?

 from datetime import datetime

data = [
    {"title": "First title", "createdAt": "2020-10-19T02:56:51 0000", "text": "Some post content", "author": "ninja"},
    {"title": "Second title", "createdAt": "2020-10-19T02:56:51 0000", "text": "Some post content", "author": "ninja"},
    {"title": "Third title", "createdAt": "2020-10-19T02:56:51 0000", "text": "Some post content", "author": "ninja"},
]

for item in data:
    try:
        item['createdAt'] = datetime.strptime(item['createdAt'], "%Y-%m-%dT%H:%M:%S%z")
    except ValueError:
        item['createdAt'] = ""

print(data)
print(data[0]['createdAt'])

  

Что дает вам:

 [{'title': 'First title', 'createdAt': datetime.datetime(2020, 10, 19, 2, 56, 51, tzinfo=datetime.timezone.utc), 'text': 'Some post content', 'author': 'ninja'}, {'title': 'Second title', 'createdAt': datetime.datetime(2020, 10, 19, 2, 56, 51, tzinfo=datetime.timezone.utc), 'text': 'Some post content', 'author': 'ninja'}, {'title': 'Third title', 'createdAt': datetime.datetime(2020, 10, 19, 2, 56, 51, tzinfo=datetime.timezone.utc), 'text': 'Some post content', 'author': 'ninja'}]
2020-10-19 02:56:51 00:00
  

Забавный факт:

Не dateutil используется!

Комментарии:

1. этот код выдает ошибку TypeError: аргумент strptime() 1 должен быть str, а не int . когда я изменяю свой код на строку[‘createdAt’] = datetime.strptime(str(строка [‘createdAt’]), «%Y-%m-%dT%H:%M:%S%z»), я получаю ту же ошибку (например, где все ‘createdAt’ поля = 0)

2. Что data тогда? Покажите нам пример объекта, с которым вы работаете.

3. data = {«title»: «First title», «createdAt»: «2020-10-19T02:56:51 0000», «text»: «Некоторое содержимое публикации», «author»: «ninja»} * 10

4. Что такое * 10 ? Означает ли это, что у вас есть десять таких объектов или список из десяти объектов, подобных показанному?

5. извините — да, например, 10 объектов json в качестве примера