Python'datetime.datetime'对象是unsubscriptable

时间:2010-03-18 22:25:03

标签: python

首先,我不是python开发人员。我试图修复从命令行执行的python脚本中的问题。这个脚本是由不在身边,不再愿意帮助解决问题的人编写的。

这是python 2.5,目前无法升级。以下是有问题的代码行:

    start_time = datetime.strptime(str(paf.Start),"%Y-%m-%d %H:%M:%S")
    dict_start = datetime(*start_time[:6])

    end_time = datetime.strptime(str(paf.End),"%Y-%m-%d %H:%M:%S")
    dict_end = datetime(*end_time[:6])

运行此代码时,它会生成描述错误:'datetime.datetime'对象是unsubscriptable。

这是导入声明:

from datetime import datetime

我觉得这很简单,但不是我的母语,谷歌没有产生任何有价值的结果,我被困住了。我尝试了几种不同的导入方法,产生了不同的错误,但都是这些语句。对此的任何帮助将不胜感激。

6 个答案:

答案 0 :(得分:2)

看起来你只是想要时间吗? datetime.strptime方法返回一个'datetime'对象,因此以下属性包含time:datetime.day,datetime.hour,datetime.year等。

答案 1 :(得分:1)

这不是导入错误。它是Python不喜欢的* start_time [:6] * end_time [:6]。替换它

答案 2 :(得分:1)

罗伯特,试着替换

dict_start = datetime(*start_time[:6])

dict_start = start_time

dict_end = datetime(*end_time[:6])

dict_end = end_time

看起来很傻,但无论如何也许会尝试一下。我的理由是:datetime.strptime返回datetime.datetime个对象。由于代码原来是

dict_start = datetime(*start_time[:6])

似乎dict_start也是datetime.datetime,具有相同的6个字段(年,月,日,小时,分钟,秒)。所以试试

dict_start = start_time

如果这不起作用,您可能需要向我们展示更多代码,以便我们可以更好地猜测目标是什么。

编辑:获取各个字段(年,月,日,小时,分钟,秒)的最简单方法是使用点表示法来访问属性。例如,

(start_time.year,start_time.month,start_time.day)

给出一个3元组,其中年,月和日为整数。

PS。有关datetime对象的更多信息,请参阅http://docs.python.org/library/datetime.html。它可能包含有用的示例。

答案 3 :(得分:1)

看起来datetime.strptime调用实际上是要调用time.strptime(在模块开头有一个单独的import time) - 后一个调用确实会返回可订阅的,类似于元组的对象和成语

xx = time.strptime(...)
yy = datetime.datetime(x[:6])

(当然,在模块的开头有import timeimport datetime)确实是在datetime.datetime之前将字符串解析为datetime.datetime实例的规范方法type添加了自己的strptime函数,它基本上只完成了这项工作。因此,它看起来像“不完全迁移”的代码。

仅从datetime.date实例datetime.datetime中提取日期(作为x对象,仅包含年,月,日 - 无小时,分钟,秒和分数),调用x.date()将返回所需的日期对象(当然不是修改x本身:datetime对象是不可变的 - 你总是创建新的,不改变现有的。)

答案 4 :(得分:1)

观察:

编写代码的人没有对其进行测试;它永远无法正常运行。

无论是谁编写它都会使datetime.datetime.strptime与time.strptime混淆。

曾几何时(双关语)datetime.datetime.strptime不存在。一个人必须做以下事情:

>>> from datetime import datetime
>>> import time
>>> time_tuple = time.strptime("2010-03-19 13:22:45","%Y-%m-%d %H:%M:%S")
>>> time_tuple
(2010, 3, 19, 13, 22, 45, 4, 78, -1)
>>> datetime(*time_tuple[:6])
datetime.datetime(2010, 3, 19, 13, 22, 45)

[:6]是一个死的赠品)

现在可以这样做:

>>> from datetime import datetime
>>> datetime.strptime("2010-03-19 13:22:45","%Y-%m-%d %H:%M:%S")
datetime.datetime(2010, 3, 19, 13, 22, 45)

答案 5 :(得分:0)

以下代码对我没有意义:

start_time = datetime.strptime(str(paf.Start),"%Y-%m-%d %H:%M:%S")
dict_start = datetime(*start_time[:6])

如果你需要在dict_start中使用元组映射,那么使用类似这样的东西:

start_time = datetime.strptime(str(paf.Start),"%Y-%m-%d %H:%M:%S")
dict_start = start_time.timetuple()[:6]

如果你需要字典,那么:

start_time = datetime.strptime(str(paf.Start),"%Y-%m-%d %H:%M:%S")
dict_start = dict(zip(('year', 'month' ,'day', 'hour', 'minute', 'second'), start_time.timetuple()[:6]))

- 或者如果可能的话,使用paf.Start。另外,我不确定但是它可能是('year','month','day','hour','minute','second')元组在Python的某处预定义std lib或者它可以很容易地被其他一些构造替换,但是现在是午夜,我没有看到任何其他明显的解决方案。