如何根据列名属性切片pandas数据帧?

时间:2017-09-26 13:27:54

标签: python python-3.x pandas dataframe

我有一个数据框,其中列名是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)

2 个答案:

答案 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]

所以换句话说,所有的比较都发生在熊猫之外。我确信这可以作为单行代码完成,但我将其分开以便于阅读。