2010-09-29 76 views
2

我对Python很新,所以希望我遇到的问题有一个简单的解决方案。Python datetime TypeError,整数预期

在工作中,我们总是使用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的动态类型的理解是,如果字符串都是数字,我不需要将字符串转换为整数。

所以这个问题似乎是我要么缺少我需要的东西,要么我对语言的理解是有缺陷的。

任何帮助将不胜感激。谢谢。

+0

一个小常用约定:在第一行使用'#!/ usr/bin/env python'。看[这个问题](http://stackoverflow.com/questions/2429511/why-do-people-write-usr-bin-env-python-on-the-first-line-of-a-python-script) 。 – snapshoe 2010-09-30 02:38:22

回答

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可能会错误地进行解析。

+0

这绝对是正确的做法 - 按位置分割字符串肯定是你想要脱离Python的那些东西之一 – Gaius 2010-09-29 19:36:43

+0

真棒,谢谢!这也适用于所有不同格式的时间戳,如YYYY-mm-dd,YYYYmmddHHMM等。这是我最终走向的地方。 – LukeFu 2010-09-29 19:51:29

0

Python更强类型;它不会自动将字符串转换为整数。执行转换需要全局功能int

+0

你的意思是atoi? – Gaius 2010-09-29 19:35:40

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 
相关问题