【问题标题】:filter dates from dataframe从数据框中过滤日期
【发布时间】:2016-08-11 04:54:58
【问题描述】:

我需要使用 pandas 数据框从 .csv 文件中删除各种日期(mm-dd-yymm/dd/yyyydd.mm.yydd-Mon-yyyy 等)。过滤方法能有用吗?

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 

如您所见,我在这里有各种日期格式。我需要将它们全部删除。

【问题讨论】:

  • 请尝试一下
  • 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)')
  • 但这会抛出 AttributeError: 'module' object has no attribute 'filter'
  • 抱歉,我是 python 新手,才刚刚开始探索
  • 好的,您可以添加数据框样本(5-6 行)和所需的输出吗?其他数据为stringfloatint?

标签: regex python-2.7 pandas


【解决方案1】:

当然你可以使用正则表达式来过滤日期,但我找到了另一种方法:拿起你的数据帧的第一行(假设你的 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)

但我认为这不是一个好的解决方案。这有点奇怪。相反,我认为您可以先分析您的原始数据

【讨论】:

  • 但是在输入格式为 2012 年 12 月 12 日的日期时,会显示以下错误。 ValueError:标签 ['12/12/2012'] 不包含在轴中
  • @AnilaA 你能告诉我你的代码和数据样本吗?
  • 我看到了你的样本。所以你的意思是你想把每个日期都改成'NaN'?或删除整列?还是行?
  • 我想从单元格中删除日期。日期也可以出现在数据之间。例如。输入:今天是 20-04-2016 和星期三。输出:今天是星期三。
  • 我明白了。那我的回答就错了。您需要的是带有正则表达式的 df.replace() 或 df.applymap() 。我稍后会改变我的答案
【解决方案2】:
 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)  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 2014-02-28
    • 2020-10-04
    • 1970-01-01
    • 2015-11-06
    • 2021-01-16
    • 2018-09-29
    相关资源
    最近更新 更多