按字符串日期过滤 pandas 中的数据
Filter data in pandas by a string date
我有一个如下所示的 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
日期列 (%Y-%m-%d) 是 Dtype datetime64[ns] 并且参数列是 Dtype float64
我还有一个字符串变量'limit_date'
我想获得一个 DF,其中只有 limit_date.
之前的日期对应的行
我已经使用了这两种不同的方法并且它们有效:
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 = '20110101' AND df.query('Date<limit_date') 时出现错误:
**UndefinedVariableError: name 'limit_date' is not defined**
有人知道如何处理这个问题吗?
我需要在我的代码中使用一个字符串变量 bc 这个 limit_date 将在整个代码中改变。
DataFrame.query
希望您引用列名; df.query('Date < limit_date')
正在尝试查询 'Date'
列中的值小于 'limit_date'
列中的值的行。 (它怎么知道 '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'
我有一个如下所示的 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 |
日期列 (%Y-%m-%d) 是 Dtype datetime64[ns] 并且参数列是 Dtype float64
我还有一个字符串变量'limit_date'
我想获得一个 DF,其中只有 limit_date.
之前的日期对应的行我已经使用了这两种不同的方法并且它们有效: 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 = '20110101' AND df.query('Date<limit_date') 时出现错误:
**UndefinedVariableError: name 'limit_date' is not defined**
有人知道如何处理这个问题吗?
我需要在我的代码中使用一个字符串变量 bc 这个 limit_date 将在整个代码中改变。
DataFrame.query
希望您引用列名; df.query('Date < limit_date')
正在尝试查询 'Date'
列中的值小于 'limit_date'
列中的值的行。 (它怎么知道 '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'