【问题标题】:len() of datetime.datetime objectdatetime.datetime 对象的 len()
【发布时间】:2014-04-11 23:01:39
【问题描述】:

我正在尝试获取python中各种类型数据的长度:

 if type(rowoutClipFC[fieldnum]) in (int, float, datetime.datetime):
       lenrowoutClipFC = len(str(rowoutClipFC[fieldnum]))
 else:
       lenrowoutClipFC = len(rowoutClipFC[fieldnum])

目前我遇到的类型有 int(), float(), str(), str() with ascii characters, datetime.datetime。

我需要将 int()、float()、datetime.datetime 对象转换为 str(),以便获得长度,而我不需要使用 ascii 的 str() 和 str() 执行此操作。由于某种原因, datetime.datetime 没有通过第一个 if 语句的气味测试,所以它出错了。我不知道为什么不是......

错误返回:

lenrowoutClipFC = len(rowoutClipFC[fieldnum])
TypeError: object of type 'datetime.datetime' has no len()

所以,它正在转向 else 语句,这不是我所期望的......

编辑:

我期待的是这样的:

for row in arcpy.SearchCursor("Strategic_Land_Resource_Planning_Area"):
    type(row.APPROVAL_DATE)

这会返回datetime.datetime

我从中提取数据的表中的字段是“日期”字段。所以,我猜它返回一个 datetime.datetime 类型......即使有人提到没有 datetime.datetime 类型这样的东西?

所以,我进一步测试:

import datetime
for row in arcpy.SearchCursor("Strategic_Land_Resource_Planning_Area"):
    if type(row.APPROVAL_DATE) == datetime.datetime:
         print 'Yes"

这会返回Yes

所以,我不确定为什么顶部的脚本不满足 if 条件....

我尝试使用 isinstance 获得相同的结果。在 if 语句中不满足。

【问题讨论】:

  • len(str(datetime.datetime...))。您无法获取 class 对象的长度。
  • 对象的长度到底是什么意思? [1] 的长度应该是 1,它作为列表的长度,还是 3,如果你先将它转换为字符串,它的长度?

标签: python datetime string-length


【解决方案1】:

这是因为 datetime.datetime 的类型不是'datetime',而是'type'。那是因为 datetime.datetime 是类,而不是类的实例。

例如

>>> import datetime

>>> type(datetime.datetime)
<type 'type'>

>>> type(datetime.datetime.now())
<type 'datetime.datetime'>

>>> type(int)
<type 'type'>
>>>

如果您要测试某物的类型,文档建议使用 isinstance() 而不是 type()(参考 https://docs.python.org/2/library/functions.html#type

试试这个:

field = rowoutClipFC[fieldnum]
if type(field) in (int, float) or isinstance(field, datetime.datetime):
    lenrowoutClipFC = len(str(field))
else:
    lenrowoutClipFC = len(field)

更简单,你可以这样做:

field = rowoutClipFC[fieldnum]
lenrowoutClipFC = len(str(field))

【讨论】:

  • 谢谢汤姆。我尝试了您的方法,但仍然无法满足 if 语句。请参阅我的帖子的编辑部分。谢谢,迈克
  • 我在下面添加了一个新答案来提问,一旦我们找到问题的底部就将其删除!
【解决方案2】:

稍微解释一下

我需要将 int()、float()、datetime.datetime 对象转换为 str() 所以我可以得到长度,而我不需要这样做 str() 和 str() 与 ascii。

在 Python 中有许多内置的序列类型,包括字符串、unicode 字符串、列表、元组等。您可以将这些类型中的任何一种传递给 len() 并且将返回一个整数,因为有一个 @987654321 @ 在 C Python 中至少它期望这些对象支持这种行为。

>>> len("hello")
5
>>> len(["foo", "bar"]
2

许多其他对象也可以传递给len(),包括像dictionaries 这样的内置类型和实现__len__() 魔术方法的自定义对象。

>>> len({"foo":"bar"}
1

但是,一些不是序列/容器的对象不支持这一点,例如您提到的 integerfloat 类型。如果您尝试将此类对象传递给len(),则会引发TypeError 异常。

>>> len(5)
TypeError: object of type 'int' has no len()

datetime 对象与您发现的一样

>>> from datetime import datetime
>>> len(datetime.today())
TypeError: object of type 'datetime.datetime' has no len()

这是有道理的——len() 应该指出对象中的项目数。您希望 datetime 对象返回什么?

因此,您可以将datetime 对象转换为字符串并计算其字符数,但这并不能告诉您太多信息。

>>> datetime.datetime.today()
'2014-04-12 00:36:03.829979'
>>> len(str(datetime.today()))
26

最终,您根本不应该尝试在 datetime 对象上调用 len() - 因此您应该重新考虑使用此代码要实现的目标。

【讨论】:

  • 我正在做的是将大量数据写入 Excel 电子表格...包括日期数据。我需要知道任何不大于 60 个字符的值的长度,以便我可以借用该长度值并将其传递到每列的宽度以确定我是否需要文本换行,所以我得到的长度是公平的每个值的字符,无论类型如何。有意义吗?
  • 基于该解释,我认为我的“更简单”的答案可能是您最好的选择-获取任何事物的字符串表示形式(即使它已经是字符串!),然后使用该字符串的长度。如果您“应该”字符串转换它,请不要费心去尝试,JFDI!
  • 我看到了您的思考过程 - 但如果您只想将日期放入 excel 列(如 YYYY-MM-DD 或您需要的任何日期格式),那么您可以格式化 datetime 对象使用 strftime() ,您将始终能够预测其长度。它永远不会超过 60 个字符,因此您不需要调用 len()。 Tom 推荐使用 isinstance 的正确方式来查找类型 BTW
【解决方案3】:

你可以试试这个:

import datetime
for row in arcpy.SearchCursor("Strategic_Land_Resource_Planning_Area"):
    if isinstance(row.APPROVAL_DATE), datetime.datetime):
         print "Yes"
    else:
         print "No"

打印“是”吗?

【讨论】:

  • 我只是再次运行它。是的。
  • 我的猜测是您的测试程序和主要程序之间存在一些差异?可能在主程序中打印一些额外的诊断信息,看看它是否与测试用例匹配?例如。打印诸如 row.APPROVAL_DATE.__class__、repr(row.APPROVAL_DATE) 和 str(row.APPROVAL_DATE) 之类的东西
  • 谢谢汤姆。在我们说话的时候,我正在做一些事情。感谢您的帮助!
  • 比捐给慈善更便宜,更有趣!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 2010-11-11
  • 2013-08-23
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多