如何对DataFrame中9:30-15:55时间范围的't'列数据排序?
问题与解答
现有如下DataFrame(DF),我需要对其中't'列里时间处于9:30到15:55之间的数据进行排序。是否可以使用类似
DF.sort_values(by='t', '16:00 < t > 9:30')的写法来实现?
d t v vw o c h l n Unnamed: 9 0 2022-05-13 09:30:00 4113 396.5365 396.80 396.30 396.80 396.30 41 NaN 1 2022-05-13 09:35:00 11846 396.4575 396.37 396.47 396.50 396.25 48 NaN 2 2022-05-13 09:40:00 3910 396.4668 396.35 396.54 396.54 396.30 21 NaN 3 2022-05-13 09:45:00 5138 396.3902 396.55 396.20 396.69 396.20 25 NaN 4 2022-05-13 09:50:00 9944 396.0286 396.23 395.88 396.23 395.88 49 NaN ... ... ... ... ... ... ... ... ... ... ... 19346 2022-10-12 23:40:00 2530 357.4370 357.43 357.44 357.46 357.42 40 NaN 19347 2022-10-12 23:45:00 5554 357.4700 357.44 357.50 357.51 357.44 82 NaN 19348 2022-10-12 23:50:00 13121 357.6356 357.51 357.60 357.71 357.51 210 NaN 19349 2022-10-12 23:55:00 9906 357.5821 357.56 357.59 357.66 357.52 106 NaN 19350 2022-10-13 00:00:00 461 357.5896 357.60 357.58 357.60 357.58 5 NaN 19351 rows × 10 columns
结论:不能使用你提到的写法
sort_values()方法没有直接接收条件筛选的参数位置,你写的DF.sort_values(by='t', '16:00 < t > 9:30')会触发语法错误——第二个参数应为ascending、kind等关键字参数,而非筛选条件。
正确实现步骤
需要先筛选符合时间条件的数据,再进行排序,以下是几种可行方案:
方案1:布尔索引筛选 + 排序
先确保t列是可比较的时间类型(若当前为字符串,先转换),再用布尔索引筛选后排序:
import pandas as pd # 若't'列是字符串类型,转换为时间类型 df['t'] = pd.to_datetime(df['t'], format='%H:%M:%S').dt.time # 筛选9:30到15:55之间的数据,并按't'列排序 filtered_sorted_df = df[ (df['t'] >= pd.to_datetime('09:30:00').time()) & (df['t'] <= pd.to_datetime('15:55:00').time()) ].sort_values(by='t')
方案2:使用query()简化筛选
如果t列是字符串或已转成时间类型,可直接用query()筛选后排序:
filtered_sorted_df = df.query("t >= '09:30:00' and t <= '15:55:00'").sort_values(by='t')
方案3:合并日期时间列(更严谨)
若需避免跨日期的时间干扰,可合并d和t列为完整datetime后操作:
# 合并日期与时间列为datetime类型 df['datetime'] = pd.to_datetime(df['d'] + ' ' + df['t']) # 筛选指定时间段并按完整时间排序 filtered_sorted_df = df[ (df['datetime'].dt.time >= pd.to_datetime('09:30:00').time()) & (df['datetime'].dt.time <= pd.to_datetime('15:55:00').time()) ].sort_values(by='datetime')
内容的提问来源于stack exchange,提问作者connorc
相关产品推荐
相关产品推荐

