如何用Pandas筛选并打印DataFrame中指定时间区间的行?
解决DataFrame时间区间筛选问题
嘿,这个问题我之前处理过不少!你现在的代码只能匹配单个时间点,要筛选整个2013年的时间区间,得先把时间列处理成正确的类型,再用合适的筛选方法,具体步骤如下:
第一步:确保时间列是datetime类型
首先检查你的localhour列是不是datetime格式——如果它现在是字符串(object类型),直接做区间比较可能会出问题(比如字符串排序逻辑和时间排序不一致)。你可以用下面的代码转换:
import pandas as pd # 转换为datetime类型,如果有特殊格式可以指定format参数,比如format='%Y-%m-%d %H:%M:%S' df['localhour'] = pd.to_datetime(df['localhour']) # 可以用这个命令确认类型:print(df['localhour'].dtype),输出应该是datetime64[ns]之类的
第二步:筛选时间区间
有三种常用的方法,选你觉得顺手的就行:
方法1:布尔索引(最直观)
直接用大于等于起始时间、小于等于结束时间的条件组合,注意:每个条件必须用括号括起来,并且要用&(元素级逻辑与)而不是Python原生的and,否则会报错!
start = '2013-01-01 00:00:00' end = '2013-12-31 00:00:00' filtered_df = df.loc[(df['localhour'] >= start) & (df['localhour'] <= end)] print(filtered_df)
方法2:用between()方法(更简洁)
pandas的between()方法可以直接帮你处理区间判断,代码更干净,自动处理了>=和<=的逻辑:
filtered_df = df.loc[df['localhour'].between(start, end)] print(filtered_df)
方法3:设置时间索引后切片(适合大数据集)
如果你的DataFrame后续还要做很多时间相关操作,可以把localhour设为索引,然后用切片语法快速筛选,效率更高:
# 设置时间索引 df = df.set_index('localhour') # 直接用索引切片筛选区间 filtered_df = df.loc['2013-01-01 00:00:00':'2013-12-31 00:00:00'] print(filtered_df) # 如果之后需要恢复原来的索引,可以用:df = df.reset_index()
另外补充个小细节:如果你的结束时间是2013-12-31 00:00:00,那这个时间点之后的2013年12月31日的其他时间(比如2013-12-31 12:00:00)不会被包含进去。如果想覆盖整个2013年的所有数据,可以把结束时间设为2014-01-01 00:00:00,然后用<代替<=,这样就能包含2013年的最后一秒啦。
内容的提问来源于stack exchange,提问作者jaayjoo
相关产品推荐
相关产品推荐

