我有一列数据,其中一个是日期,我希望删除具有闰日的行。这是一个多年的范围,所以我希望放弃任何匹配02-29过滤器。
我使用的一种方法是添加其他列,分别提取月份和日期,然后过滤数据,如下所示。它起到了目的的作用,但从效率的角度来看显然不是很好
df['Yr'], df['Mth-Dte'] = zip(*df['Date'].apply(lambda x: (x[:4], x[5:])))
df = df[df['Mth-Dte'] != '02-29']
有没有更好的方法通过直接在数据框中的列上应用过滤器来实现它?
添加数据
ID Date
22398 IDM00096087 1/1/2005
22586 IDM00096087 1/1/2005
21790 IDM00096087 1/2/2005
21791 IDM00096087 1/2/2005
14727 IDM00096087 1/3/2005
提前致谢
答案 0 :(得分:2)
转换为datetime并使用布尔掩码。
import pandas as pd
data = {'Date': {14727: '1/3/2005',
21790: '1/2/2005',
21791: '1/2/2005',
22398: '1/1/2005',
22586: '29/2/2008'},
'ID': {14727: 'IDM00096087',
21790: 'IDM00096087',
21791: 'IDM00096087',
22398: 'IDM00096087',
22586: 'IDM00096087'}}
df = pd.DataFrame(data)
Option1,转换+ dt:
df.Date = pd.to_datetime(df.Date)
# Filter away february 29
df[~((df.Date.dt.month == 2) & (df.Date.dt.day == 29))] # ~ for not equal to
Option2,转换+ strftime:
df.Date = pd.to_datetime(df.Date)
# Filter away february 29
df[df.Date.dt.strftime('%m%d') != '0229']
选项3,无需转换:
mask = pd.to_datetime(df.Date).dt.strftime('%m%d') != '0229'
df[mask]