【问题标题】:How to handle multiple datetime-formats within a dataset?如何处理数据集中的多种日期时间格式?
【发布时间】:2020-11-16 04:56:29
【问题描述】:

在一个数据集中,有几个不同的日期时间字符串。

例如:

2020-11-16T06:00:00Z

2020-11-16T06:00:00+01:00

2020-11-16T06:00:00+01:00Z

2020-11-16T06:00:00+02:00

2020-11-16T06:00:00.000Z

我想在几秒钟后替换所有内容,但它给了我错误,例如首先没有给出 +01:00.. 或者其他。

你有什么办法,怎么处理?

如果我能得到,那就足够了:

%Y-%m-%dT%H:%M

(基础知识,如何strp和strf都知道...)

我整晚都在为这个问题争论不休。 希望你们中的一个有解决方案...

提前谢谢你!

【问题讨论】:

  • 这些基本上都是IS8601格式的日期时间字符串,见thread
  • 请注意2020-11-16T06:00:00+01:00Z实际上并不正确,Z表示祖鲁时间,但+01:00与此相矛盾
  • 谢谢,我只是想说明不同的时间格式,并没有注意正确的格式。这些只是作为示例。我已经为我的问题找到了一个简单的解决方案,并在本主题的末尾进行了说明。

标签: python python-3.x datetime


【解决方案1】:

Python 有一个标准库来处理这个问题:

import dateutil.parser

examples = [
    '2020-11-16T06:00:00Z',
    '2020-11-16T06:00:00+01:00',
    '2020-11-16T06:00:00+01:00Z',
    '2020-11-16T06:00:00+02:00',
    '2020-11-16T06:00:00.000Z'
]

for e in examples:
    try:
        print(dateutil.parser.parse(e))
    except ValueError:
        print(f'Invalid datetime: {e}')

结果:

2020-11-16 06:00:00+00:00
2020-11-16 06:00:00+01:00
Invalid datetime: 2020-11-16T06:00:00+01:00Z
2020-11-16 06:00:00+02:00
2020-11-16 06:00:00+00:00

@Z4-tier 也为您的示例提供了一个解决方案(但要小心不要只保留字符串的末尾),但 dateutil 也会处理更多奇特的东西:

print(dateutil.parser.parse('15:45 16 Nov 2020'))

结果:

2020-11-16 15:45:00

还要注意这一点:

        print(dateutil.parser.parse(e).tzinfo)

如果您添加它,您会看到dateutil 在结果中包含有关时区的信息,如果您只解析字符串的第一部分,这些信息将会丢失。

【讨论】:

  • 啊,dateutil。好主意。但是为什么它会在2020-11-16T06:00:00+01:00Z 上卡住呢?我认为这是一个有效的 ISO 日期。
  • 不是 - Z 表示祖鲁时间 (UTC+0),但 +01:00 表示实际上距离祖鲁时间一个小时。
【解决方案2】:

这个怎么样:

import datetime

dates = ['2020-11-16T06:00:00Z',
         '2020-11-16T06:00:00+01:00',
         '2020-11-16T06:00:00+01:00Z',
         '2020-11-16T06:00:00+02:00',
         '2020-11-16T06:00:00.000Z']

for d in dates:
    datetime.datetime.fromisoformat(d[0:19])

由于每个日期在偏移量和时区之前都具有相同的格式,因此只需从字符串中删除该部分并将其转换为 datetime.datetime

【讨论】:

  • 请注意,您的代码只是忽略了时区指示,因为您只为每个日期字符串解析 [0:19]
  • @Grismar 是的,我知道。由于帖子要求%Y-%m-%dT%H:%M,我假设这是可以接受的(如果是,这可能是到达那里的最快方式)。
  • 鉴于示例数据包括+01:00+02:00 区域中的时间戳,我打赌 OP 会遇到需要了解差异的情况。毕竟,它们相隔一个小时。
【解决方案3】:

数据集由抓取新闻页面的抓取工具生成。

因此,日期时间首先被抓取为字符串,因此必须在多次不同的情况下进行转换,然后才能执行 strptime。

我找到了解决问题的方法,这受到了你们所有方法的影响。 ''' 日期 = '2020-11-16T06:00:00+01:00' 分裂 = 19 日期 = 日期[:splitat] 日期 '''

这产生了我需要的标准化格式:

'2020-11-16T06:00:00'

【讨论】:

  • 这是我在回答中建议的(d[0:19]date[:splitat] 相同)。 StackOverflow 不是一个典型的互联网论坛,因此无需回复只是说“谢谢”。相反,您应该选择一个最能帮助您找到解决方案的答案,然后单击它旁边的复选标记以接受它作为答案。我很高兴您找到了适合您的解决方案!
  • 谢谢(尽管如此,在我看来,礼貌的举止如今到处都变得罕见了 ;-) )。你介意给我一个提示,在哪里查找你的例子?从我有限的知识来看,我无法意识到 (d[0:19]) 与他迄今为止的行为相似[:splitat]。我想阅读并学习。
  • 您可以寻找涵盖列表和字符串主题的教程。这实际上是一个字符串操作的问题,但在 Python 中,字符串与列表在您可以使用[x:y] 方括号来索引它们的方式方面有很多相似之处。在这种情况下,d[0:19]date[:splitat] 相同,因为您可以省略起始索引,它将默认为零。
  • 虽然很多互联网教程都写得不太好,所以如果你真的想要一个写得清晰且编辑得当的地方来学习,我会去买一本来自 o 的入门书籍'赖利。他们有几本 Python 书籍,但“Think Python”可能是一个不错的起点。
猜你喜欢
  • 1970-01-01
  • 2018-04-25
  • 2013-09-01
  • 2021-01-17
  • 2015-09-17
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多