【问题标题】:Selecting specific dates from dataframe从数据框中选择特定日期
【发布时间】:2018-12-28 09:22:18
【问题描述】:

我有一个包含“日期”列的数据集,其中包含多种格式的日期,包括:

  • 2018.05.07
  • 2018 年 6 月 1 日
  • 2018 年 6 月 1 日报告
  • 2018 年 6 月
  • 2018
  • 1970 年之前
  • 1941-1945
  • 钙。 1960

还有无效的日期,如:

  • 190Feb-2010

我正在尝试查找具有确切日期(日、月和年)的日期并将它们转换为日期时间。我还需要在字段中排除带有“报告”的日期。有什么方法可以过滤此类数据,而不需要找到所有可能的日期格式?

【问题讨论】:

  • 因此,您要么必须过滤掉坏条目,要么过滤掉好的条目。我不知道你的数据集有多大,但我建议先过滤掉to_datatime 无法处理的条目。不过,您的问题太宽泛,无法在这里回答。
  • "2018" 可以由to_datetime 处理,但我不需要这样的日期。猜猜最好找到好的,但我怎么能确定呢? :) 大约有 6k 行

标签: python pandas


【解决方案1】:

使用 dateutil 库。

if 语句检查是否缺少日期(月、年、日期)的任何部分,如果是则避免。

如果想从“Reported 01 Jun 2018”等字符串中提取日期,请使用 fuzzy=True

    import dateutil.parser
    dates = ["2018.05.07","01-Jun-2018","Reported 01 Jun 2018","Jun 2018","2018","before 1970","1941-1945","Ca. 1960","190Feb-2010"]
    formated_date = []
    for date in dates:
        try:
            if dateutil.parser.parse(date,fuzzy=False,default=datetime.datetime(2015, 1, 1)) == dateutil.parser.parse(date,fuzzy=False,default=datetime.datetime(2016, 2, 2)):
                formated_date.append(yourdate)
        except:
            continue

另一种解决方案。这是使用每种格式检查每个日期的蛮力方法。继续添加更多格式以使其适用于任何日期格式。但这是一种耗时的方法。

import datetime

dates = ["2018.05.07","01-Jun-2018","Reported 01 Jun 2018","Jun 2018","2018","before 1970","1941-1945","Ca. 1960","190Feb-2010"]

formats = ["%Y%m%d","%Y.%m.%d","%Y-%m-%d","%Y/%m/%d","%Y%a%d","%Y.%a.%d","%Y-%a-%d","%Y%A%d","%Y.%A.%d","%Y-%A-%d",
          "%d-%m-%Y","%d.%m.%Y","%d%m%Y","%d/%m/%Y","%d-%b-%Y","%d%b%Y","%d.%b.%Y","%d/%b/%Y"]

formated_date = []
for date in dates:
    for fmt in formats:
        try:
            dt = datetime.datetime.strptime(date,fmt)
            formated_date.append(dt)
        except:
            continue

【讨论】:

    【解决方案2】:
    In [1]: string_with_dates = """entries are due by January 4th, 2017 at 8:00pm created 01/15/2005 by ACME Inc. and associates."""
    
    In [2]: import datefinder
    
    In [3]: matches = datefinder.find_dates(string_with_dates)
    
    In [4]: for match in matches:
       ...:     print match
    
    
    2017-01-04 20:00:00
    2005-01-15 00:00:00
    

    希望这将帮助您从带有日期的字符串中查找日期

    【讨论】:

      猜你喜欢
      • 2018-03-22
      • 2020-07-13
      • 2016-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多