[英]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.