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

标签 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']

是否有更好的方法通过直接在数据框中的列上应用过滤器来实现这一点?

添加数据

        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

提前致谢

最佳答案

转换为日期时间并使用 bool 掩码。

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,转换 + 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]

关于python-3.x - 在 python 中过滤月份和日期,而不考虑年份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48038936/

相关文章:

python - 旋转 Pandas DataFrame -- AssertionError : Index length did not match values

python - 查找每个唯一 ID 列中特定值之前的索引列表

python - 从数据框中选择特定值

python - 如何将多维数据框作为联合添加到另一个多维数据框?

python - 如何测试python中父类(super class)的顺序?

python 新的 AST 优化器

python - 读取 CSV 文件时如何从文本字段中删除这些符号?

python - 将前 1...N 个月的值移动为单独的列

python-3.x - asyncio 是否已从 redis-py 中删除?

python - 如何使用 django.test.TestCase 断言异常?