【问题标题】:ISO 8601 datetime format: parse 11:05:14 PM into 23:05:14ISO 8601 日期时间格式:将 11:05:14 PM 解析为 23:05:14
【发布时间】:2015-12-01 12:25:29
【问题描述】:

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

当我将以下日期 08/10/2015 11:05:14 PM 转换为 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))

【问题讨论】:

  • 你的模式是%H:%M:%S %p%H你不需要%p
  • @hjpotter92 - 我认为 %p 解决了日期时间的 AM/PM 部分,对吗?
  • 是的,但是%H represents 24 小时制。 AM/PM 对于这种格式是多余的。
  • 详细阅读您的问题,尝试使用%I 而不是%H

标签: python csv datetime iso8601


【解决方案1】:

输入格式到底如何?

当我将您的格式字符串更改为%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 会考虑上午/下午部分。

【讨论】:

  • 我的输入格式如下:['3/11/2016 5:48:49 PM', '80008761', '246', '0.700481055630595', '1582422.09999997', '158242.0999997 '9998'] 第一个字段。
【解决方案2】:

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

来自文档:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多