Python Strptime 格式化

0 投票
1 回答
852 浏览
提问于 2025-04-18 06:00

我在使用Python处理日期和时间时遇到了问题。以下是我的错误信息:

28/09/12
Traceback (most recent call last):
  File "product-release-by-year.py", line 49, in <module>
    get_earliest_order_date(fin)
  File "product-release-by-year.py", line 25, in get_earliest_order_date
    date = datetime.datetime.strptime(order_date, '%d/%m/%Y').date()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 325, in _strptime
    (data_string, format))
ValueError: time data '28/09/12' does not match format '%d/%m/%Y'

还有相关的代码部分:

def get_earliest_order_date(fin):
    # CSV Headers
    product_col = 1
    order_col = 0

    f = open(fin, 'rb')
    try:
        reader = csv.reader(f, delimiter=";")
        next(reader, None) 
        for row in reader:

            product_name = row[product_col]

            order_date = row[order_col]
            print order_date

            date = datetime.datetime.strptime(order_date, '%d/%m/%Y').date()

            if product_name not in products:
                products[product_name] = date
            else:
                if date < products[product_name]:
                    products[product_name] = date
    finally:
        f.close()

从我看到的情况来看,格式字符串应该是正确的吧?在终端直接输入这个字符串时,这个调用strptime是可以正常工作的。

有没有什么想法?

1 个回答

4

%Y 需要用四位数来表示年份,包括世纪。要解析只有两位数的年份,可以使用 %y

示例:

>>> import datetime
>>> order_date = '28/09/12'
>>> datetime.datetime.strptime(order_date, '%d/%m/%Y')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/_strptime.py", line 325, in _strptime
    (data_string, format))
ValueError: time data '28/09/12' does not match format '%d/%m/%Y'
>>> datetime.datetime.strptime(order_date, '%d/%m/%y')
datetime.datetime(2012, 9, 28, 0, 0)

%y 根据C语言的POSIX规范来处理世纪:

%y
表示世纪内的年份(0-99)。如果没有特别说明世纪,69到99的值表示的是20世纪的年份(1969-1999);而00到68的值则表示21世纪的年份(2000-2068)。

撰写回答