【问题标题】:check format of date from streaming file python从流文件python检查日期格式
【发布时间】:2018-04-10 08:09:11
【问题描述】:

我有一个大数据框。其中一列是格式为 (mmddyear) 的日期。它必须遵循这种格式。我之间不能有任何虚线(即 mm-dd-year)。

让python从大型数据集中过滤掉所有格式错误的数据的最有效方法是什么?

例如,我有这个数据框:

sales = [('account', ['A11', 'C11',  'A12','B12','A13','B11','C12','C13']),
     ('date', [1011997,  7202005,2011997,12102001,10012000,11012001,'','110'])
     ]

df = pd.DataFrame.from_items(sales)

哪些输出:

account date
0   A11 1011997
1   C11 7202005
2   A12 2011997
3   B12 12102001
4   A13 10012000
5   B11 11012001
6   C12 
7   C13 110

C12 和 C13 的日期格式错误。

【问题讨论】:

  • 过滤它们到底是什么?
  • 通过过滤器,我的意思是删除没有写入帐户格式的行。在上述情况下,我想删除最后两行

标签: python pandas sorting date datetime


【解决方案1】:

由于您的日期格式是有效整数,因此直接从整数值测试有效日期可能是最简单的方法,例如:

代码:

def valid_date(date):
    if not isinstance(date, int):
        try:
            date = int(date)
        except ValueError:
            return False

    month_day, year = divmod(date, 10000)
    month, day = divmod(month_day, 100)

    try:
        dt.datetime(year=year, month=month, day=day)
        return True
    except ValueError:
        return False

删除行:

df[df.date.apply(valid_date)]

测试代码:

import datetime as dt
import pandas as pd

sales = [
    ('account', ['A11', 'C11', 'A12', 'B12', 'A13', 'B11', 'C12', 'C13']),
    ('date',
     [1011997, 7202005, 2011997, 12102001, 10012000, 11012001, '', '110'])
    ]

df = pd.DataFrame.from_items(sales)

print(df)
   
print(df[df.date.apply(valid_date)])

结果:

  account      date
0     A11   1011997
1     C11   7202005
2     A12   2011997
3     B12  12102001
4     A13  10012000
5     B11  11012001
6     C12          
7     C13       110

  account      date
0     A11   1011997
1     C11   7202005
2     A12   2011997
3     B12  12102001
4     A13  10012000
5     B11  11012001

【讨论】:

  • 谢谢。当我将代码应用于数据框时,日期 1122017 (mmddyyyy) 输出 11012017,而我应该得到 01122017。代码用零填充日 dd 而不是月 mm。有办法解决吗?
【解决方案2】:

要过滤日期本身,您应该首先检查以确保值的长度正确,然后验证它是否是有效日期。

from datetime import datetime

def check_date(date):
    date = str(date)
    length = len(date)

    # Date string is 8 characters, except for Jan. - Sept.
    if length != 7 and length != 8:
        return False

    if length == 7:
        date = "0" + date

    # Check if the date string is valid
    try:
        datetime(year=int(date[4:]), month=int(date[0:2]), day=int(date[2:4]))
    except:
        return False

    return True

【讨论】:

  • 嗨,我一直在为所有输入错误。例如,我尝试了 check_date('20180101')、check_date('20170101')、check_date('20012007') 并且当我希望至少前两个返回 true 时,我得到了所有这些结果。我是不是调用错函数了?
  • 在您的原始帖子中,您说日期格式为 MMDDYYYY,但看起来您正在使用 YYYYDDMM 对其进行测试。编辑:我也对函数做了一些小改动
  • 谢谢。当我输入日期 1122017 (mmddyyyy) 时,我得到 11012017,而我应该得到 01122017。代码中是否还有错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 2021-07-10
  • 2022-08-18
  • 1970-01-01
  • 2020-04-16
  • 2015-04-19
  • 1970-01-01
相关资源
最近更新 更多