Pandas - Python,根据日期列删除行

Posted

技术标签:

【中文标题】Pandas - Python,根据日期列删除行【英文标题】:Pandas - Python, deleting rows based on Date column 【发布时间】:2015-04-22 03:24:53 【问题描述】:

我正在尝试根据一个日期列删除数据框的行; [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] 列根据这两个变量删除行。

谁能提供正确的解决方案?

【问题讨论】:

【参考方案1】:

确保计算本身在“6 个月”之前是准确的。您可能不想在 188 天内进行硬编码。并非所有月份都是平等的。

from datetime import date
from dateutil.relativedelta import relativedelta

#http://***.com/questions/546321/how-do-i-calculate-the-date-six-months-from-the-current-date-using-the-datetime
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)

【讨论】:

嘿,这是返回错误:drop() 至少需要 2 个参数,给定 1 个【参考方案2】:

你可以过滤掉它们:

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

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

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

查看文档以获取boolean indexing 的解释

【讨论】:

谢谢.. 我收到一个返回错误:TypeError: 'Can only use .dt accessor with datetimelike values' - 可能需要单独的问题,但这是否意味着我必须更改 [Delivery日期] 到日期时间?抱歉,我对此很陌生 你可以有字符串而不是日期时间,你可以转换做df['Delivery Date'] = pd.to_datetime(df['Delivery Date'])

以上是关于Pandas - Python,根据日期列删除行的主要内容,如果未能解决你的问题,请参考以下文章

根据列值删除Python Pandas中的DataFrame行[重复]

如何在 pandas 的数据框中选择多个日期列,然后将它们全部格式化? (Python)

Python Pandas:将日期时间列分组为小时和分钟聚合

如何根据python中的另一列自动添加日期?

如何使用 python 或 pandas 根据包含字典列表的列过滤 DataFrame?

Python Pandas - 根据值删除行