【问题标题】:Convert UTC timestamp column but get ValueError: time data '-27' does not match format '%Y-%m-%dT%H:%M:%S.%fZ'转换 UTC 时间戳列但得到 ValueError:时间数据 '-27' 与格式 '%Y-%m-%dT%H:%M:%S.%fZ' 不匹配
【发布时间】:2020-05-13 03:26:28
【问题描述】:

给定数据框中的 UTC 时间戳列,我想将它们转换为 2018-10-07 06:59:05.162000 之类的格式:

         _source.@timestamp
0  2018-10-07T06:59:05.162Z
1  2018-10-07T06:59:05.075Z
2  2018-10-07T06:59:05.103Z
3  2018-10-07T06:59:05.093Z
4  2018-10-07T06:59:05.108Z
5  2018-10-07T06:59:05.110Z
6  2018-10-07T06:59:07.148Z
7  2018-10-07T06:59:09.164Z
8  2018-10-07T06:59:09.214Z

我已经应用了以下代码:

df['_source.@timestamp'] = pd.to_datetime(df['_source.@timestamp'], format='%Y-%m-%dT%H:%M:%S.%fZ')

但它会引发错误:ValueError: time data '-27' does not match format '%Y-%m-%dT%H:%M:%S.%fZ' (match)

通过添加errors='coerce':

df['_source.@timestamp'] = pd.to_datetime(df['_source.@timestamp'], 
                                       format='%Y-%m-%dT%H:%M:%S.%fZ', 
                                       errors='coerce')

我得到以下结果,但似乎不正确:

2018-10-07T06:59:05.162Z   NaT
2018-10-07T06:59:05.075Z   NaT
2018-10-07T06:59:05.103Z   NaT
2018-10-07T06:59:05.093Z   NaT
2018-10-07T06:59:05.108Z   NaT
                            ..
2018-10-07T09:55:33.596Z   NaT
2018-10-07T09:55:33.647Z   NaT
2018-10-07T09:55:33.581Z   NaT
2018-10-07T09:55:33.655Z   NaT
2018-10-07T09:55:35.593Z   NaT
Name: _source.@timestamp, Length: 10000, dtype: datetime64[ns]

此代码可能有助于解决问题:

utc = "2018-10-07T06:59:05.162Z"
UTC_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ"
utcTime = datetime.datetime.strptime(utc, UTC_FORMAT)
print(utcTime)

输出:

2018-10-07 06:59:05.162000

如何正确转换列?谢谢。

【问题讨论】:

  • 无法重现您的错误,所以只是问一下,您是否尝试过不指定pd.to_datetime(df['_source.@timestamp'])之类的格式?
  • 对我来说也可以正确处理示例数据。
  • 旁注:因为你有 ISO 8601 兼容的字符串,例如pd.to_datetime('2018-10-07T06:59:05.162Z') 正确解析为 Timestamp('2018-10-07 06:59:05.162000+0000', tz='UTC')。所以你没有必须提供format

标签: python-3.x pandas datetime


【解决方案1】:

列名'_source.@timestamp' 让 python 认为它是一个电子邮件超链接而不是一个字符串,因此你得到一个 keyError。

改为这样做 -

df.iloc[:,0] = pd.to_datetime(df.iloc[:,0], format='%Y-%m-%dT%H:%M:%S.%fZ')

输出-

0   2018-10-07 06:59:05.162
1   2018-10-07 06:59:05.075
2   2018-10-07 06:59:05.103
3   2018-10-07 06:59:05.093
4   2018-10-07 06:59:05.108
5   2018-10-07 06:59:05.110
6   2018-10-07 06:59:07.148
7   2018-10-07 06:59:09.164
8   2018-10-07 06:59:09.214
Name: _source.@timestamp, dtype: datetime64[ns]

【讨论】:

  • 你不工作df['_source.@timestamp'] = pd.to_datetime(df['_source.@timestamp'], format='%Y-%m-%dT%H:%M:%S.%fZ') ?
  • 是的,我认为问题是由于列名引起的,当我重命名时,不再出现错误。
猜你喜欢
  • 1970-01-01
  • 2020-04-03
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 2021-10-11
  • 2022-01-20
相关资源
最近更新 更多