特定 ISO 格式的 Pandas 日期时间转换

Posted

技术标签:

【中文标题】特定 ISO 格式的 Pandas 日期时间转换【英文标题】:Pandas Datetime Conversion from a particular ISO format 【发布时间】:2019-05-08 12:37:10 【问题描述】:

非常感谢您提前提供的帮助。

我正在尝试将作为 ISO 格式字符串的日期时间转换为日期时间对象。但是尝试了很多方法都没有成功。请您帮忙。

例如,我有一个数据框,其列时间类似于如下所示。这是从数据库中提取的,这是输出的格式。

2018-12-04T04:39:26Z
2018-12-04T05:10:54.6Z
2018-12-04T05:17:32Z
2018-12-04T10:51:20.5Z
...

到目前为止我已经尝试过(多次尝试)但没有成功:

df.index = pd.to_datetime(df.index, format = "%Y-%m-%dT%H:%M:%SZ", errors='ignore')

df.index = pd.to_datetime(df.index)

df.time = df.time.map(lambda x: pd.to_datetime(dt.datetime.strptime(x, '%Y-%m-%dT%H:%M:%SZ'), format = '%d/%m/%Y %H:%M'))

再次感谢!

【问题讨论】:

在知道时间列表中有两种 iso 格式之前,我尝试了这些尝试。我该如何处理? 您使用的是哪个 pandas 版本以及遇到哪些错误? df.index = pd.to_datetime(df.index) 使用您发布的示例为我工作 您可以发布它产生的错误(使用您调用的确切代码)吗?两种不同格式到底有什么问题?当我将此示例数据粘贴到 IPython 中并调用 pandas.to_datetime 时,它适用于所有整体,没有错误,结果正确。你得到什么不正确的结果? 你可能需要pd.to_datetime(df.index, errors='coerce')。这应该处理这两种格式,并且仍然将完全不正确的日期强制为NaT。在第一种情况下,有两种格式不匹配,引发错误,errors='ignore' 这将返回输入。 如果没有更多代码支持该问题,我发现很难提供帮助,请向我们展示真正的Dataframehead 【参考方案1】:

聚会有点晚了,但我相信这种反应需要可见,以缓解人们的生活。

如果如您所说,它是从数据库中提取的,那么您可以在建立数据框时直接进行。大多数 pandas 读取函数都有一个参数parse_dates。如documentation中所说:

注意:iso8601 格式的日期存在快速路径。

因此,即使您有 2 列或更多列日期,您也可以非常简单地完成。

df = pd.read_csv("x.csv", parse_dates=['Date1', "Date2"], names=["ID", "Date1", "Date2"])

【讨论】:

我知道这个问题是关于特定格式的,但是由于人们从这里复制粘贴代码,请注意:我遇到了格式不明确的设置问题。问题是对于特殊情况,该文件可能只包含日期不明确的日期(例如,01 02 2021 真的是 Jan02, 2021 还是 Feb01, 2021)导致一个讨厌的错误【参考方案2】:

pandas.to_datetime() 方法有一个“infer_datetime_format”参数,文档说:

infer_datetime_format : boolean, default False
If True and no format is given, attempt to infer the format of the datetime strings, 
and if it can be inferred, switch to a faster method of parsing them. 
In some cases this can increase the parsing speed by ~5-10x.

所以将 infer_datatime_format 设置为 true 并保留 format 参数默认值,它对我有用。

这是我的情况:

>>> hours_df.head()
                            Open    High   Close     Low         Volume
Date                                                                   
2020-01-05T02:00:00.000Z  7457.9  7481.5  7431.3  7442.1  1147.57478328
2020-01-05T01:00:00.000Z  7374.8    7479  7374.8  7457.9  2709.45095966
2020-01-05T00:00:00.000Z  7354.9  7392.1  7354.2  7374.7   642.60575144

>>> hours_df.index
Index(['2020-01-05T02:00:00.000Z', '2020-01-05T01:00:00.000Z',
       '2020-01-05T00:00:00.000Z'],
      dtype='object', name='Date')

>>> hours_df.index = pd.to_datetime(hours_df.index, infer_datetime_format=True)

>>> hours_df.index
DatetimeIndex(['2020-01-05 02:00:00+00:00', '2020-01-05 01:00:00+00:00',
               '2020-01-05 00:00:00+00:00'],
              dtype='datetime64[ns, UTC]', name='Date', freq=None)

>>> hours_df.head()
                             Open    High   Close     Low         Volume
Date                                                                    
2020-01-05 02:00:00+00:00  7457.9  7481.5  7431.3  7442.1  1147.57478328
2020-01-05 01:00:00+00:00  7374.8    7479  7374.8  7457.9  2709.45095966
2020-01-05 00:00:00+00:00  7354.9  7392.1  7354.2  7374.7   642.60575144

【讨论】:

【参考方案3】:

我以前想回答这个问题。最后,我只是创建了一个处理不同数据输入的函数,并创建了一个带有列名的数据框。感谢 ALollz 对 pd.to_datetime(df.index, errors='coerce') 的评论。

所以为了从 ISO 格式的字符串转换索引,我建立并遵循以下顺序:

df = pd.DataFrame([[-1.8, '2018-09-14T13:36:00Z']], columns = ['current', 'time'])
df.set_index('time', inplace = True)   # make it your index by using the inplace=True
df.index = pd.to_datetime(df.index, errors='coerce')

转换为日期时间后,检查日期是否正确。如果读取错误,您可能需要指定格式。

谢谢!

【讨论】:

以上是关于特定 ISO 格式的 Pandas 日期时间转换的主要内容,如果未能解决你的问题,请参考以下文章

Python pandas 转换(yy/mm)日期格式并选择特定时间范围

使用 Pandas 将字符串格式化为日期时间 - 指令问题

如何将 Excel 中的日期转换为 ISO 8601 格式

如何防止 pandas 将原始数据库日期格式转换为 pandas 日期格式

使用 pandas.to_datetime 转换时指定日期格式

如何正确地将数据帧的所有日期时间列转换为 iso 格式