Python datetime 类型错误,期待整数

2 投票
3 回答
10726 浏览
提问于 2025-04-16 04:46

我刚接触Python,希望我遇到的问题有简单的解决办法。

在工作中,我们一直使用Shell(ksh)或Perl来做脚本工作。因为Python已经在Solaris系统中使用了一段时间,所以它终于被批准作为脚本平台。我开始用Python来改进我们的脚本。

我想做的是把一个时间戳和一个表示时间戳的字符串转换成一个日期时间对象,以便进行一些日期计算。

以下是我的示例代码:

#!/bin/python

import datetime

fileTime="201009211100"
format = "YYYYmmdd"

yIdxS = format.find('Y')
yIdxE = format.rfind('Y')

if not fileTime[yIdxS:yIdxE+1].isdigit():
    print "ERROR: Year in wrong format"
    exit
else:
    print "Year [" + fileTime[yIdxS:yIdxE+1] + "]"

mIdxS = format.find('m')
mIdxE = format.rfind('m')

if not fileTime[mIdxS:mIdxE+1].isdigit():
    print "ERROR: Month in wrong format"
    exit
else:
    print "Month [" + fileTime[mIdxS:mIdxE+1] + "]"

dIdxS = format.find('d')
dIdxE = format.rfind('d')

if not fileTime[dIdxS:dIdxE+1].isdigit():
    print "ERROR: Day in wrong format"
    exit
else:
    print "Day [" + fileTime[dIdxS:dIdxE+1] + "]"


old = datetime.date( fileTime[yIdxS:yIdxE+1], \
                     fileTime[mIdxS:mIdxE+1], \
                     fileTime[dIdxS:dIdxE+1] );

我得到了以下输出/错误:

Year [2010]
Month [09]
Day [21]
Traceback (most recent call last):
  File "./example.py", line 37, in <module>
    fileTime[dIdxS:dIdxE+1] );
TypeError: an integer is required

我不明白为什么会出现这个TypeError异常。我理解Python是动态类型的,应该不需要把一个全是数字的字符串转换成整数。

所以问题似乎是我要么缺少了什么,要么对这个语言的理解有误。

任何帮助都会非常感激。谢谢。

3 个回答

0

Python是一种类型更严格的编程语言,它不会自动把字符串转换成整数。你需要使用全局函数int来进行这种转换。

1

datetime.date 需要整数。把你代码的最后一行改成这样,就能得到你想要的结果:

old = datetime.date( int(fileTime[yIdxS:yIdxE+1]), \
                 int(fileTime[mIdxS:mIdxE+1]), \
                 int(fileTime[dIdxS:dIdxE+1]) );

不过,还有一种更简单、可能更符合 Python 风格的方法:

old = datetime.datetime.strptime(fileTime, '%Y%m%d%H%M')

在你脚本的开头这样做,你就可以轻松提取各种部分,像这样:

print 'Month: %d' % old.month 
5

强烈建议使用 datetime.datetime.strptime 这个方法:

import datetime

tests=["201009211100","201009211199"]
for fileTime in tests:
    try:
        date=datetime.datetime.strptime(fileTime,'%Y%m%d%H%M')
        print(date)
    except ValueError as err:
        print(fileTime,err)

# 2010-09-21 11:00:00
# ('201009211199', ValueError('unconverted data remains: 9',))

或者,如果你安装了一个第三方模块 dateutil,你可以这样解析日期:

In [106]: import dateutil.parser as dparser

In [107]: dparser.parse('201009211100')
Out[107]: datetime.datetime(2010, 9, 21, 11, 0)

注意,dateutil 会尝试自动解析字符串,而不需要你明确指定格式。这种方式需要小心使用(要进行测试并控制输入字符串的格式),因为有些日期可能会让 dateutil 解析错误,导致歧义。

撰写回答