Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解析多个日期格式_Python_Pandas_Date - Fatal编程技术网

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的答案,因为他的答案排在第一位。因为你的解决方案也很好。谢谢:)没问题。。。只要你的挑战解决了,一切都很好如果这不使用循环,我会建议这样的答案:)但是正则表达式很棒