繁体   English   中英

Pandas 日期格式(可选毫秒)

[英]Pandas Date Formatting (With Optional Milliseconds)

我从 API 获取数据并将其放入 Pandas DataFrame。 日期列需要格式化为日期/时间,我正在这样做。 然而,API 有时会返回与格式模式不匹配的不带毫秒的日期。 这会导致错误:

time data '2020-07-30T15:57:37Z' does not match format '%Y-%m-%dT%H:%M:%S.%fZ' (match)

在此示例中,如何将日期列格式化为日期/时间,以便所有日期都以毫秒为单位?

import pandas as pd

dates = {
    'date': ['2020-07-30T15:57:37Z', '2020-07-30T15:57:37.1Z']
}

df = pd.DataFrame(dates)

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

print(df)

一次包含毫秒,另一次不包含毫秒。 ValueError发生时,使用errors='coerce'返回NaT

with_miliseconds = pd.to_datetime(df['date'], format='%Y-%m-%dT%H:%M:%S.%fZ',errors='coerce')
without_miliseconds = pd.to_datetime(df['date'], format='%Y-%m-%dT%H:%M:%SZ',errors='coerce')

结果将是这样的:

with milliseconds:
0                       NaT
1   2020-07-30 15:57:37.100
Name: date, dtype: datetime64[ns]

without milliseconds:
0   2020-07-30 15:57:37
1                   NaT
Name: date, dtype: datetime64[ns]

然后您可以用另一个数据框的值填充一个数据框的NaT ,因为它们相互补充。

with_miliseconds.fillna(without_miliseconds)
0   2020-07-30 15:57:37.000
1   2020-07-30 15:57:37.100
Name: date, dtype: datetime64[ns]

由于您的日期字符串看起来像标准ISO 8601 ,您可以避免使用format参数。 解析器将考虑到毫秒是可选的。

import pandas as pd

dates = {
    'date': ['2020-07-30T15:57:37Z', '2020-07-30T15:57:37.1Z']
}

df = pd.DataFrame(dates)

df['date'] = pd.to_datetime(df['date'])

print(df)
                              date
0        2020-07-30 15:57:37+00:00
1 2020-07-30 15:57:37.100000+00:00

要在输出 DataFrame 中具有一致的格式,您可以在将所有值转换为 df 之前运行正则表达式替换,而无需磨机。

dates = {'date': [re.sub(r'Z', '.0Z', date) if '.' not in date else date for date in dates['date']]}

因为只有那些包含. 有工厂,我们可以在其他人身上运行替代品。
之后,其他一切都与您的代码相同。
输出:

                     date
0 2020-07-30 15:57:37.000
1 2020-07-30 15:57:37.100

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM