【发布时间】:2020-06-08 18:44:13
【问题描述】:
我将一个文件读入 pandas 数据框中,其日期格式各不相同:
任一美国人:
YYYY-MM-DD或欧洲人:
DD.MM.YYYY
它们以字符串的形式出现。我想将它们全部格式化为日期对象,以便 pandas.Series.dt 可以使用它们,并且理想情况下将它们设置为第二种格式 (DD.MM.YYYY)。
pandas.Series.dt 对一列中的两种不同拼写感到困惑。
【问题讨论】:
我将一个文件读入 pandas 数据框中,其日期格式各不相同:
任一美国人:YYYY-MM-DD
或欧洲人:DD.MM.YYYY
它们以字符串的形式出现。我想将它们全部格式化为日期对象,以便 pandas.Series.dt 可以使用它们,并且理想情况下将它们设置为第二种格式 (DD.MM.YYYY)。
pandas.Series.dt 对一列中的两种不同拼写感到困惑。
【问题讨论】:
将to_datetime分别与两种格式一起使用,因此如果格式不匹配,则获取缺失值,因此对于新列使用Series.fillna:
df = pd.DataFrame({'date': ['2000-01-12', '2015-01-23', '20.12.2015', '31.12.2009']})
print (df)
date
0 2000-01-12
1 2015-01-23
2 20.12.2015
3 31.12.2009
date1 = pd.to_datetime(df['date'], errors='coerce', format='%Y-%m-%d')
date2 = pd.to_datetime(df['date'], errors='coerce', format='%d.%m.%Y')
df['date'] = date1.fillna(date2)
print (df)
date
0 2000-01-12
1 2015-01-23
2 2015-12-20
3 2009-12-31
最好采用第二种格式
python/pandas 中的日期时间格式默认为YYYY-MM-DD,如果需要自定义也可以,但是值会转换为字符串,所以类日期时间函数失败:
df['date'] = df['date'].dt.strftime('%d.%m.%Y')
print (df)
date
0 12.01.2000
1 23.01.2015
2 20.12.2015
3 31.12.2009
print (type(df.loc[0, 'date']))
<class 'str'>
【讨论】:
只需检查您拥有两种格式中的哪一种,然后使用该格式应用pandas.to_datetime。
df = pd.DataFrame({'date': ['2000-01-12', '2015-01-23', '20.12.2015',
'31.12.2009']})
print(df)
date
0 2000-01-12
1 2015-01-23
2 20.12.2015
3 31.12.2009
def date_formator(date):
if '-' in date:
return pd.to_datetime(date, format = '%Y-%m-%d')
else:
return pd.to_datetime(date, format = '%d.%m.%Y')
df.date.apply(date_formator)
0 2000-01-12
1 2015-01-23
2 2015-12-20
3 2009-12-31
Name: date, dtype: datetime64[ns]
【讨论】: