Python 解析多个日期格式
我一直坚持以下格式:Python 解析多个日期格式,python,pandas,date,Python,Pandas,Date,我一直坚持以下格式: 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: p
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'])
def解析(日期):
如果len(date)我们可以使用pd.to\u datetime
并使用errors='concurve'
分步解析日期
假设您的列名为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]
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
如您所见,我们有两个NaT
在我们的系列中是空的datetime值,它们与缺少一天的datetime相对应
然后,我们重新应用相同的datetime
方法,但格式相反,并将其应用于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]
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
然后我们重新分配给您的数据帧。您可以使用正则表达式提取年份和月份,并转换为日期时间:
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
df=pd.read_剪贴板(“\s{2,}”,header=None,names=[“Dates”])
模式=r“(?P\d{4})[-]*(?P\d{1,2})”
df['Dates']=pd.to_datetime([f”{year}-{month}表示df.Dates.str.extract(pattern.to_numpy()]中的年、月)
打印(df)
日期
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,因为只提供了年份和月份Hi@sammywemmy,我接受了Datavoice的答案,因为他的答案排在第一位。因为你的解决方案也很好。谢谢:)没问题。。。只要你的挑战解决了,一切都很好如果这不使用循环,我会建议这样的答案:)但是正则表达式很棒