ISO 8601日期时间格式:解析11:05:14 PM到23:05:14

时间:2015-12-01 12:25:29

标签: python csv datetime iso8601

我目前正在使用ISO格式,但我不确定如何获得ISO(8601)格式。

当我将以下日期08/10/2015 11:05:14转换为ISO格式时,我会得到2015-08-10T11:05:14 + 0000

理想情况下我应该得到2015-08-10T23:05:14 + 0000

将日期编辑为iso格式的行是:

new[3] = datetime.strptime(new[3], "%m/%d/%Y %H:%M:%S %p").isoformat() + '+0000'

代码:

from tempfile import NamedTemporaryFile
from datetime import datetime
from shutil import move
from operator import itemgetter
import csv
from pathlib import Path


def change_file(in_file, cols):
    with open(in_file) as f, NamedTemporaryFile("w", dir=".", delete=False) as tmp:
        r = csv.reader(f)
        wr = csv.writer(tmp)
        count = 0
        for row in r:
            if count == 0:
                new = []
                for x in itemgetter(*cols)(row):
                    new.append(x.lstrip())
                wr.writerow(new)
                count += 1
                continue
            if row != '\n':
                new = []
                print(row)

                for x in itemgetter(*cols)(row):
                    new.append(x.lstrip())
                new[3] = datetime.strptime(new[3], "%m/%d/%Y %H:%M:%S %p").isoformat() + '+0000'
                print(new)
                wr.writerow(new)
        move(tmp.name, in_file)

for fle in Path('./BM').glob('**/*/cplt.csv'):
    print(fle)
    change_file(str(fle), (6, 2, 1, 0, 5))

2 个答案:

答案 0 :(得分:2)

输入格式究竟如何?

当我将格式字符串更改为%m/%d/%y %H:%M:%S时,请执行以下操作

print datetime.strptime('08/10/15 23:05:14', '%m/%d/%y %H:%M:%S').isoformat() + '+0000'

给出了正确的结果:

2015-08-10T23:05:14+0000

修改

感谢您提供其他信息,如果您只是将%H替换为%I,那么它应该有效:

 print datetime.strptime('8/10/2015 11:05:14 PM', '%m/%d/%Y %I:%M:%S %p').isoformat() + '+0000'

来自datetime docs

  

%I - 小时(12小时制)作为零填充十进制数。

仅考虑%I am / pm部分。

答案 1 :(得分:1)

使用%I指令时,应使用%p格式解析小时。

来自文档:

  

当与strptime()方法一起使用时,如果使用%I指令来解析小时,则%p指令仅影响输出小时字段。