基本的Python JSON日期时间转换问题

时间:2015-04-20 00:28:44

标签: python json datetime

我是一个蟒蛇初学者并且遇到了问题。尝试提取API信息并将提取的JSON时间对象转换为Python中的datetime对象,这样我最终可以在其上运行date.weekday()函数(总体目标是从API中提取所有日期并查看输出按天 - 我计划在提取所有日期后填充空字典。

出于某种原因,即使我的条件陈述,我仍然打印(2015,04,06)所有的零。那是我的问题。

我有一种感觉我得到了一些基本错误,并且还有一种更好的方法来解决这个问题,而不是在日期对象中使用0-padding进行所有ifs / elses。

到目前为止,这是我的代码:

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)))

3 个答案:

答案 0 :(得分: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块。

或者,您可以将此调整后的字符串拆分为"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不是内置包,你必须安装它):)

答案 1 :(得分:0)

从json获得的内容实际上是ISO格式的日期时间表示

您可以参考此SO答案https://stackoverflow.com/a/15228038/58129来转换字符串

答案 2 :(得分: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)