我有一个看起来像这样的 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'