我受制于以下格式:
0 2001-12-25
1 2002-9-27
2 2001-2-24
3 2001-5-3
4 200510
5 20078
我需要的是%Y-%m格式的日期
我尝试过的是
def parse(date):
if len(date)<=5:
return "{}-{}".format(date[:4], date[4:5], date[5:])
else:
pass
df['Date']= parse(df['Date'])
但是,我仅成功将20078解析为2007-8,像2001-12-25这样的格式显示为None。 那么,我该怎么办呢?谢谢!
答案 0 :(得分:1)
我们可以使用pd.to_datetime
和errors='coerce'
来逐步解析日期。
假设您的列称为date
s = pd.to_datetime(df['date'],errors='coerce',format='%Y-%m-%d')
s = s.fillna(pd.to_datetime(df['date'],format='%Y%m',errors='coerce'))
df['date_fixed'] = s
print(df)
date date_fixed
0 2001-12-25 2001-12-25
1 2002-9-27 2002-09-27
2 2001-2-24 2001-02-24
3 2001-5-3 2001-05-03
4 200510 2005-10-01
5 20078 2007-08-01
逐步
首先,我们将常规日期时间转换为一个名为s
的新系列
s = pd.to_datetime(df['date'],errors='coerce',format='%Y-%m-%d')
print(s)
0 2001-12-25
1 2002-09-27
2 2001-02-24
3 2001-05-03
4 NaT
5 NaT
Name: date, dtype: datetime64[ns]
如您所见,我们有两个NaT
,它们是我们系列中的空datetime值,它们对应于您缺少一天的datetime,
然后,我们重新应用相同的datetime
方法,但格式相反,并将其应用于s
的缺失值
s = s.fillna(pd.to_datetime(df['date'],format='%Y%m',errors='coerce'))
print(s)
0 2001-12-25
1 2002-09-27
2 2001-02-24
3 2001-05-03
4 2005-10-01
5 2007-08-01
然后我们将其重新分配给您的数据框。
答案 1 :(得分:0)
您可以使用正则表达式提取年份和月份,并转换为日期时间:
df = pd.read_clipboard("\s{2,}",header=None,names=["Dates"])
pattern = r"(?P<Year>\d{4})[-]*(?P<Month>\d{1,2})"
df['Dates'] = pd.to_datetime([f"{year}-{month}" for year, month in df.Dates.str.extract(pattern).to_numpy()])
print(df)
Dates
0 2001-12-01
1 2002-09-01
2 2001-02-01
3 2001-05-01
4 2005-10-01
5 2007-08-01
请注意,由于只提供了年份和月份,因此熊猫自动将日期转换为1。