检查来自流文件python的日期格式

时间:2017-10-29 03:59:47

标签: python pandas sorting date datetime

我有一个大数据框。其中一列是格式的日期(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)

ouptputs:

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的日期格式错误。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

代码:

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

Drop Rows:

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