假设我有一个以日期为索引的DataFrame df
,其中含有一些值。如何选择日期大于某个值x
的行?
我知道我可以将索引转换为列,然后进行选择df[df['date']>x]
,但比在索引上执行该操作慢吗?
假设我有一个以日期为索引的DataFrame df
,其中含有一些值。如何选择日期大于某个值x
的行?
我知道我可以将索引转换为列,然后进行选择df[df['date']>x]
,但比在索引上执行该操作慢吗?
使用索引从DataFrame中进行选择的示例:
from numpy.random import randn
from pandas import DataFrame
from datetime import timedelta as td
import dateutil.parser
d = dateutil.parser.parse("2014-01-01")
df = DataFrame(randn(6,2), columns=list('AB'), index=[d + td(days=x) for x in range(1,7)])
In [1]: df
Out[1]:
A B
2014-01-02 -1.172285 1.706200
2014-01-03 0.039511 -0.320798
2014-01-04 -0.192179 -0.539397
2014-01-05 -0.475917 -0.280055
2014-01-06 0.163376 1.124602
2014-01-07 -2.477812 0.656750
In [2]: df[df.index > dateutil.parser.parse("2014-01-04")]
Out[2]:
A B
2014-01-05 -0.475917 -0.280055
2014-01-06 0.163376 1.124602
2014-01-07 -2.477812 0.656750
现有的答案是正确的,但如果我们基于索引进行选择,则这里的第二种方法会更快:
# Set index
df = df.set_index(df['date'])
# Select observations between two datetimes
df.loc[pd.Timestamp('2002-1-1 01:00:00'):pd.Timestamp('2002-1-1 04:00:00')]
pd.Timestamp
中,Timestamp
中的s
应该是小写。 - shreyanspx
的行(例如,'2002-1-1 01:00:00' 将被包括在内),而问题是选择索引大于 x
的行。 - bennylp或者您可以使用{{link1:query
}}:
In [14]: df = pd.DataFrame(
...: {'alpha': list('ABCDE'), 'num': range(5)},
...: index=pd.date_range('2022-06-30', '2022-07-04'),
...: )
In [15]: df
Out[15]:
alpha num
2022-06-30 A 0
2022-07-01 B 1
2022-07-02 C 2
2022-07-03 D 3
2022-07-04 E 4
In [16]: df.query('index >= "2022-07-02"')
Out[16]:
alpha num
2022-07-02 C 2
2022-07-03 D 3
2022-07-04 E 4
结合ntg和Datageek的答案来解决各自答案的问题。使用dateutil
需要额外导入。 loc
方法在技术上是不正确的,因为它无法定义“大于”关系,而不手动递增时间戳可能会在处理纳秒范围内的时间时引起问题。
因此,在我看来,结合两种方法是最好的解决方案:
In [5]: df = pd.DataFrame(
...: ...: {'alpha': list('ABCDE'), 'num': range(5)},
...: ...: index=pd.date_range('2022-06-30', '2022-07-04'),
...: ...: )
In [6]: df
Out[6]:
alpha num
2022-06-30 A 0
2022-07-01 B 1
2022-07-02 C 2
2022-07-03 D 3
2022-07-04 E 4
In [7]: df[df.index > pd.Timestamp('2022-06-30')]
Out[7]:
alpha num
2022-07-01 B 1
2022-07-02 C 2
2022-07-03 D 3
2022-07-04 E 4
df[df.index > x]
。 - Karl D.df[df > x]
即可。 - EdChum