特定 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'
这将返回输入。
如果没有更多代码支持该问题,我发现很难提供帮助,请向我们展示真正的Dataframe
的head
。
【参考方案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 将原始数据库日期格式转换为 pandas 日期格式