我需要使用pandas dataframe从mm-dd-yy
文件中删除所有类型的日期(mm/dd/yyyy
,dd.mm.yy
,dd-Mon-yyyy
,.csv
等)。过滤方法可以用吗?
for col in df.columns.values:
pd.filter(regex = '(([1-9]|1[012])[-/.]([1-9]|[12][0-9]|3[01])[-/.](19|20)\d\d)|((1[012]|0[1-9])(3[01]|2\d|1\d|0[1-9])(19|20)\d\d)|((1[012]|0[1-9])[-/.](3[01]|2\d|1\d|0[1-9])[-/.](19|20)\d\d)')
例如:如果我的.csv
文件包含各种列,其中包含一些数据和日期,例如10/12/2015
,12/01/1995
,2016-19-04
,19th April,2016
等。 ,输出文件必须不包含日期。
数据样本
column1 column2 column3
data 4th April,2016 data
4/20/2016 20-04-16 20.04.2016
data data 20-04-2016
4-Apr-16 data 20/04/2016
你可以看到我在这里有各种日期格式。我需要将它们全部删除。
答案 0 :(得分:0)
当然你可以使用正则表达式来过滤掉日期,但我找到了另一种方法:选择你的数据框的第一行(假设你的df中没有NaN),用每个值初始化一个pandas.Timestamp
对象排。如果成功,则相应的列包含日期
time_columns = []
for col in df.columns:
try:
t = pandas.Timestamp(df.loc[0, col])
time_columns.append(col)
except Exception:
pass
df = df.drop(time_columns, axis=1)
但我不认为这是一个很好的解决方案。这有点奇怪。相反,我认为您可能首先分析原始数据
答案 1 :(得分:0)
I have found a solution for 80% of my problem. Some more date formats need to be validated. Thank you for your suggestions and help everyone. :)
def executeDateRemover(self):
data = self.readCSV()
newData = data
for column in newData:
newData[column]= newData[column].map(lambda x: re.sub(r'(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)(?:0?2|(?:Feb))\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})', ' ', x))
pass
self.writeCSV(newData)