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

基本Python JSON日期时间转换问题,python,json,datetime,Python,Json,Datetime,我是python初学者,有一个问题。尝试提取API信息并将提取的JSON时间对象转换为Python中的datetime对象,以便最终对其运行date.weekday()函数(总体目标是从API中提取所有日期,并按天查看输出-我计划在提取完所有日期后填充一个空字典) 出于某种原因,即使使用条件语句,我仍在打印(2015、04、06)中的所有零。那是我的问题 我有一种感觉,我犯了一些基本的错误,还有一种更好的方法来解决这个问题,而不是在date对象中使用0填充来执行所有ifs/ELSE 以下是我目前

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

出于某种原因,即使使用条件语句,我仍在打印(2015、04、06)中的所有零。那是我的问题

我有一种感觉,我犯了一些基本的错误,还有一种更好的方法来解决这个问题,而不是在date对象中使用0填充来执行所有ifs/ELSE

以下是我目前的代码:

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

从json中得到的实际上是ISO格式的日期时间表示


您可以参考此答案来转换字符串,因为Python有自己的解析函数

from dateutil import parser
from datetime import date

my_date = dateutil.parser.parse(modified)

is_week_day = date.weekday(my_date)
如果计算机上未安装
dateutil
,请尝试
pip安装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)

错误发生在当前代码中,因为新的_格式定义为字符串,而
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不是一个内置软件包,您必须安装它):

NameError
当您尝试使用一个尚未声明的变量时,如果
modified[5]==0
modified[5]==1
,则代码只声明新的\u格式,但如果
modified[5]
两者都不相等,则变量未定义。啊,我只需要把第二个if换成else。但我仍然得到一个(2015,04,06)的输出,所有的零。知道为什么@jwilner吗?@mu無 这与我正在进行的字符串操作无关吗?@jwilner假设modified是一个时间戳,
modified[5]
只能是0或1,所以elif vs else应该无关紧要無, 代码因名称错误而失败,因为变量未定义。变量在
if
elif
块中定义;因此,它从未命中任何一个块——可能是因为modified[5]是一个字符串,并且
0==“1”或0==“0”#False
我还将对标准
datetime
库发出呼喊。IMO,明确预期的输入总是更好,而
datetime.datetime.strtime(日期字符串,“%Y-%m-%dT%H:%m:%sZ”)
更为明确。另外,没有第三方库。@jwilner您的(合法)叫喊已经被听到了hanks@mu無 - 看起来dateutil.parser.parse工作得很好,但是我想知道为什么在用您的格式替换了我的条件之后,我仍然在努力将输出转换为datetime.date对象。datetime.date(新格式)告诉我需要一个整数,不是元组,而是datetime.date(int(新格式)也不会给我带来好运。很抱歉,所有的lvl问题都是初学者提出的。@spicyclubauce我在我的答案中运行了当前的代码,它工作正常,所以你能重新检查一下吗?另外,我做了一系列的编辑,所以请看一下当前形式的答案。嘿@mu無 - 行了!这个*是做什么的?我在中没有这个,当我在中没有这个时会出现一个错误。@spicyclubsause解压元组/列表。如果没有
*
,列表将作为单个参数传递。有了它,列表的元素将作为多个参数传递。如果这有帮助,请不要忘记:)