从数据框中过滤日期

时间:2016-04-19 07:17:01

标签: regex python-2.7 pandas

我需要使用pandas dataframe从mm-dd-yy文件中删除所有类型的日期(mm/dd/yyyydd.mm.yydd-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/201512/01/19952016-19-0419th 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 

你可以看到我在这里有各种日期格式。我需要将它们全部删除。

2 个答案:

答案 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)