Pandas - Python,基于日期列删除行

20

我想根据数据框中的一个日期列[Delivery Date]删除行。

我需要删除6个月前但不等于1970年的行。

我创建了2个变量:

from datetime import date, timedelta
sixmonthago = date.today() - timedelta(188)

import time
nineteen_seventy = time.strptime('01-01-70', '%d-%m-%y')

但我不知道如何基于这两个变量使用[Delivery Date]列来删除行。

有人可以提供正确的解决方案吗?

2个回答

26

您可以直接将它们过滤掉:

df[(df['Delivery Date'].dt.year == 1970) | (df['Delivery Date'] >= sixmonthago)]

这将返回所有年份为1970或日期早于6个月的行。

您可以使用布尔索引并传递多个条件来过滤数据框,对于多个条件,您需要使用数组运算符 | 而不是 or,并且由于运算符优先级的关系,需要在条件周围加上括号。

有关布尔索引的说明,请查看文档。


谢谢。。。我遇到了一个返回错误:TypeError: 'Can only use .dt accessor with datetimelike values' - 可能需要另外一个问题,但这是否意味着我必须将[Delivery Date]更改为datetime?抱歉,我对此还很陌生。 - Colin O'Brien
1
你可能有字符串而不是日期时间,你可以通过 df['Delivery Date'] = pd.to_datetime(df['Delivery Date']) 进行转换。 - EdChum

4

请确保计算本身准确地针对“6个月”之前。您可能不想在代码中硬编码188天。并非所有的月份都是相等的。

from datetime import date
from dateutil.relativedelta import relativedelta

#https://dev59.com/ZHRB5IYBdhLWcg3wtJGF
six_months = date.today() - relativedelta( months = +6 )

那么您可以应用以下逻辑。
import time
nineteen_seventy = time.strptime('01-01-70', '%d-%m-%y')

df = df[(df['Delivery Date'].dt.year == nineteen_seventy.tm_year) | (df['Delivery Date'] >= six_months)]

如果你想真正删除数据框的某些部分,可以按照以下步骤进行:

df = df[(df['Delivery Date'].dt.year != nineteen_seventy.tm_year) | (df['Delivery Date'] < six_months)].drop(df.columns)

1
嘿,这里返回了一个错误:drop()需要至少2个参数,但只提供了1个。 - Colin O'Brien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接