pandas 识别所有日期组合?

6ljaweal  于 2023-11-15  发布在  其他
关注(0)|答案(2)|浏览(105)

我最近接手了一个正在进行的研究项目,令我沮丧的是,我们的本科生研究助理似乎没有遵循我们关于日期条目的编码指南。最小的工作示例如下:

import pandas as pd
MWE = [["05/2003"], ["10/1998"], ["1/4/2014"], ["12/09/1979"]]
df = pd.DataFrame(MWE)
df = df.rename(columns={0: 'year'})

字符串
有一些奇怪的球条目,即“2005年9月12日”和“20221204”,但从我所看到的大多数条目似乎要么遵循%m%y%d%m%y,或%m%d%y
1.有超过1万行的数据,有没有什么方法可以快速识别所有不同的日期格式?我最初的方法是print(df["year"].value_counts()),手动梳理数据以发现所有的变化。这似乎有点乏味,想象一下有更好的方法吗?(我也是从Stata来到Python的,这是一个学习曲线。)
1.理想情况下,我们希望同时保留月份和年份,所以我不确定最好的解决方案。最低限度,如果我们想至少提取年份,我想我可以在适用的情况下使用df['year_only'] = df['year'].str[-4:],尽管在最后四位数字不构成年份的情况下,这显然会导致问题。
任何关于如何处理这种困境的想法或建议将不胜感激!

ddhy6vgd

ddhy6vgd1#

其中一种可能的方法是从你的框架中获取一个pandas Series,并应用一个合适的正则表达式,通过使用contains方法来识别你在条目中遇到的日期:
https://pandas.pydata.org/docs/reference/api/pandas.Series.str.contains.html

dldeef67

dldeef672#

我向here展示了一种从字符串中识别可能的日期时间格式的方法。然而,在您的情况下,像1/4/201412/09/1979这样的日期有很强的模糊性,它们都是有效的D/M/YM/D/Y
我建议使用不同的格式进行解析(仅使用dayfirst=True/dayfirst=False是一个很好的起点,然后您可以添加其他格式)。第二次,检查两个日期位置是否可以产生不同的有效日期,您可能需要手动分析这些(如果您知道哪个学生填写了哪个日期,您可能可以识别所使用的格式)。

s1 = pd.to_datetime(df['year'], dayfirst=True)
s2 = pd.to_datetime(df['year'], dayfirst=False)
#s3 = pd.to_datetime(df['year'], format='%m/%Y')

df['ambiguous'] = s1!=s2
df['date'] = s1.fillna(s2)#.fillna(s3)

字符串
输出量:

year  ambiguous       date
0     05/2003      False 2003-05-01
1     10/1998      False 1998-10-01
2    1/4/2014       True 2014-04-01
3  12/09/1979       True 1979-09-12

相关问题