проверить формат даты из потокового файла python

У меня большой кадр данных. Один из столбцов - это дата в формате (mmddyear). Он должен следовать этому формату. У меня не может быть никаких штриховых линий (т. Е. Мм-дд-год).

Каков наиболее эффективный способ заставить 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

Ответов: 2


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 Строки:

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

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
питон, панды, сортировка, дата, дата и время,
Похожие вопросы
Яндекс.Метрика