Python 3.x 在python中过滤月份和日期,而不考虑年份

Python 3.x 在python中过滤月份和日期,而不考虑年份,python-3.x,pandas,Python 3.x,Pandas,我有一列数据,其中一列是日期,希望删除包含闰日期的行。这是一个年的范围,所以我希望放弃任何匹配02-29过滤器 我使用的一种方法是添加其他列,分别提取月份和日期,然后过滤数据,如下所示。它达到了目的,但从效率的角度来看显然不好 df['Yr'], df['Mth-Dte'] = zip(*df['Date'].apply(lambda x: (x[:4], x[5:]))) df = df[df['Mth-Dte'] != '02-29'] 有没有更好的方法通过直接在数据帧中的列上应用过滤器来

我有一列数据,其中一列是日期,希望删除包含闰日期的行。这是一个年的范围,所以我希望放弃任何匹配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

提前感谢

转换为日期时间并使用布尔掩码

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)
选项1,转换+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
选项2,转换+标准时间:

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]

你能分享一些数据吗?您应该转换为datetime:pd.to_datetime(),并使用.dt.month==2和.dt.day==29进行过滤。如果是年,你可以简单地使用mod(%)。谢谢。我还在学习这个。我想我可以使用datetime函数,但是我想不出一种方法,可以像你提到NP那样,在一条语句中写出它,但是你需要删除什么呢?只有2月29日?是的。这是正确的。我只需要忽略闰日。太棒了。。。谢谢那正是我要找的for@rajeev添加的选项不需要使datetime列。对于像我这样的人来说,第二个选项看起来有点太复杂了。需要一些时间来消化。@rajeev我简化了strftime的替代方案。如果这对未来的行动有帮助的话。新年快乐。我真的理解了你昨天写的第一封信。当你回去重读它的时候,这是非常有意义的。这个也比较简单。你刚刚教了我三种解决方法。谢谢你的帮助