我有一个数据框,其中列名是datatime对象,如下所示:
17:02:00 17:03:00 ...
2017-09-18 1236.0 463.0
2017-09-19 791.0 476.0
2017-09-20 2086.0 988.0
如何根据列名值选择数据帧的切片,如此伪代码:
df_slice = df.column_name >= datetime.time(8, 30) & df.column_name < datetime.time(9, 0)
答案 0 :(得分:4)
我认为您需要先按to_datetime
+ time
将值转换为times
,然后按条件选择列:
df.columns = pd.to_datetime(df.columns).time
df_slice = df.loc[:, (df.columns >= datetime.time(8, 30)) &
(df.columns < datetime.time(9, 0))]
样品:
print (df)
17:02:00 08:45:00
2017-09-18 1236.0 463.0
2017-09-19 791.0 476.0
2017-09-20 2086.0 988.0
df.columns = pd.to_datetime(df.columns).time
df_slice = df.loc[:, (df.columns >= datetime.time(8, 30)) &
(df.columns < datetime.time(9, 0))]
print (df_slice)
08:45:00
2017-09-18 463.0
2017-09-19 476.0
2017-09-20 988.0
感谢@Zero
简化回答:
df.loc[:, (df.columns > '08:30:00') & (df.columns < '09:00:00')]
答案 1 :(得分:1)
我想说的是:
from datetime import datetime
to_dt = lambda x : datetime.strptime(x, '%H:%M:%S')
time_1 = to_dt('08:30:00')
time_2 = to_dt('09:00:00')
cols_to_use = [
i for i in df.columns if
to_dt(i) >= time_1 and
to_dt(i) <= time_2
]
df_slice = df.loc[:, cols_to_use]
所以换句话说,所有的比较都发生在熊猫之外。我确信这可以作为单行代码完成,但我将其分开以便于阅读。