python - 通过字符串 date 过滤 pandas 中的数据

我有一个看起来像这样的 DataFrame :

Date Parameter
2010-01-02 some value
2010-01-03 some value
2010-01-04 some value
... ...
2011-01-02 some value
2011-01-03 some value
2011-01-04 some value
... ...
2012-01-02 some value
2012-01-03 some value
2012-01-04 some value

Date 列 (%Y-%m-%d) 是 Dtype datetime64[ns] 并且参数列是 Dtype float64

我还有一个字符串变量'limit_date'

我想得到一个 DF,它在 limit_date 之前只有与 dates 对应的行。

我使用了这两种不同的方法并且它们起作用了: df[df['Date']<'2011-01-01'] df.query('Date<20110101')

在这两种情况下,我都会得到类似这样的东西:

Date Parameter
2010-01-02 some value
2010-01-03 some value
2010-01-04 some value
... ...
2010-12-30 some value
2010-12-31 some value

然而。如果我想使用字符串 limit_date 我会遇到问题:

  • 当我使用 limit_date = '2011-01-01' AND df[df['Date']<limit_date] 我得到一个空的 DF

  • 当我使用 limit_date = '20110101' AND df.query('Date<limit_date') 我得到错误:

    **UndefinedVariableError: name 'limit_date' is not defined**

有谁知道如何处理这个问题?

我需要在我的代码中使用一个字符串变量 bc 这个 limit_date 将在整个代码中改变。

回答1

DataFrame.query 希望您引用列名; df.query('Date < limit_date') 正在尝试查询 'Date' 列中的 value 小于 'limit_date' 列中的 value 的行。 (它怎么知道 'Date' 是一个列,但 limit_date 是一个变量,因为您以类似方式引用它们?)

要区分列和环境变量,您需要在环境变量之前添加 @

df.query('Date < @limit_date')
#        Date
#0 2010-01-01
#1 2010-01-02
#2 2010-01-03
#3 2010-01-04

您的第一次尝试: df[df['Date'] < limit_date] 在技术上是正确的,应该可以工作。很可能,您对 DataFrame 应用了以前的过滤器并覆盖了结果,所以现在当您应用此过滤器时,它会产生一个空的 DataFrame。刷新内核并从头开始。

样本数据

import pandas as pd

df = pd.DataFrame({'Date': pd.date_range('2010-01-01', freq='D', periods=20)})
limit_date = '2010-01-05'

相似文章