2015-04-20 1 views
3

Я начинающий питон и имею проблему. Попытка вывести информацию API и преобразовать извлеченный объект времени JSON в объект datetime в Python, поэтому я могу запустить функцию date.weekday() на нем в конечном итоге (общая цель состоит в том, чтобы извлечь все даты из API и посмотреть, какой результат по дням - я планирую заполнить пустой словарь, как только я смогу извлечь все даты).базовый Python JSON Datetime конвертировать вопрос

По какой-то причине даже с моими условными утверждениями я все еще печатаю (2015, 04, 06) со всеми нулями. Это моя проблема.

У меня такое чувство, что у меня что-то не так, и что есть еще лучший способ сделать это, чем делать все ifs/elses с помощью 0-padding в объекте даты.

вот мой код до сих пор:

from datetime import date 
import datetime 
import json 
import requests 

r = requests.get('https://api.github.com/repos/mbostock/d3/commits?since=2015-04-12330:00:000') 
jsonoutput = r.json() 
modified = (jsonoutput[0]["commit"]["author"]["date"]) 
#at this point, modified gives something like: "2015-04-06T22:28:16Z" 

if modified[5] == 0: 
    if modified[8] == 0: 
     new_format = ("(" + modified[0:4] + ", " + modified[6] + ", " + modified[9] + ")") 
     #with the particular jsonoutput[0] pulled here, this one should be triggered 
    else: 
     new_format = ("(" + modified[0:4] + ", " + modified[6] + ", " + modified[8:10] + ")") 

else: 
    if modified[8] == 0: 
     new_format = ("(" + modified[0:4] + ", " + modified[5:7] + ", " + modified[9] + ")") 
    else: 
     new_format = ("(" + modified[0:4] + ", " + modified[5:7] + ", " + modified[8:10] + ")") 

print(new_format) 

print(date.weekday(datetime.date(new_format))) 
+0

'NameError' возникает, когда вы пытаетесь использовать переменную, которую вы еще не объявили. Ваш код только объявляет new_format, если' modified [5] = = 0' или 'изменяет [5] == 1' - но если' modified [5] 'тоже не равно, переменная не определена. – jwilner

+0

ах, мне просто нужно было изменить второе, если на другое. Но я все еще получаю вывод (2015, 04, 06) со всеми нулями. любая идея, почему @jwilner? – SpicyClubSauce

+0

@mu 無 не должен ли это иметь значение при манипуляции строкой, которую я делаю? – SpicyClubSauce

ответ

2

ошибка происходит в текущем потому что new_format определяется как строка, а datetime.date принимает аргументы как целые числа. Кроме того, поскольку вы сравниваете строку "0" с номером 0, измененные просто не создаются.

Вместо этого:

new_format = ("(" + modified[0:4] + ", " + modified[6] + ", " + modified[8:10]) + ")") 

сделать это:

new_format = (int(modified[0:4]), int(modified[5:7]), int(modified[8:10])) 

выше будет работать со всеми вашими случаях, так что вы можете удалить запутанные if - else блоков, а также.

В качестве альтернативы, можно разделить эту строку modeified по "T", а затем использовать другой раскол по "-", чтобы получить целые значения:

new_format = map(int, modified.split("T")[0].split("-")) 

Вам также необходимо распаковать список при передаче в качестве аргумента, так что ваш полный код будет выглядеть так:

import json 
import requests 
from datetime import date 

r = requests.get('https://api.github.com/repos/mbostock/d3/commits?since=2015-04-12330:00:000') 
jsonoutput = r.json() 
modified = jsonoutput[0]["commit"]["author"]["date"] 
new_format = (int(modified[0:4]), int(modified[5:7]), int(modified[8:10])) 
print(date.weekday(date(*new_format))) 

Кроме того, как другие уже указывали в своих ответах, это могло бы быть лучше идеей до dateutil.parser.parse, чем написать собственную логику синтаксического анализа.(dateutil не является встроенным пакетом, вам придется его установить) :)

+0

thanks @mu 無 - похоже, что dateutil.parser.parse отлично работает, но мне интересно, почему после замены моих условных выражений ваш формат, я все еще изо всех сил пытаюсь преобразовать вывод в объект datetime.date. datetime.date (new_format) говорит мне, что требуется целое число, а не кортеж, но datetime.date (int (new_format) тоже не дает мне удачи. Извините за всех абсолютно начинающих вопросов lvl man. – SpicyClubSauce

+0

@SpicyClubSauce Я запустил текущий код в своем ответе, и он работает нормально, так что вы можете перепроверить? Кроме того, я сделал серию изменений, поэтому взгляните на ответ в его текущей форме. –

+0

hey @mu 無 - это работает! Что делает * do? У меня этого не было, и это дает ошибку, когда у меня этого нет. – SpicyClubSauce

0

Что вы получаете от JSON на самом деле дата и время представления в формате ISO

Вы можете обратиться к этому SO ответа https://stackoverflow.com/a/15228038/58129 преобразовать строку

0

Вы пытаетесь создать свои собственные функции синтаксического анализа, когда у Python есть свои собственные.

from dateutil import parser 
from datetime import date 

my_date = dateutil.parser.parse(modified) 

is_week_day = date.weekday(my_date) 

Если dateutil не установлен на вашем компьютере, попробуйте pip install python-dateutil


Однако, если вы хотите пойти со стандартной библиотекой языка Python:

from datetime import date, datetime 
from time import strptime 

mytime = strptime(modified, '%Y-%m-%dT%H:%M:%SZ') 
my_date = datetime(*my_time[:6]) 

is_week_day = date.weekday(my_date) 
+0

Я также просто собираюсь выкрикнуть для стандартной библиотеки 'datetime'. Явное понимание ожидаемых входов всегда лучше, IMO и 'datetime.datetime.strptime (date_string,"% Y-% m-% dT% H:% M:% sZ ")' является более явным. Кроме того, нет сторонних библиотек. – jwilner

+0

@jwilner ваш (законный) крик был услышан – Jivan

Смежные вопросы