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