在Python中选择两次

时间:2017-08-10 14:49:43

标签: python pandas datetime for-loop if-statement

我使用了output = result.set_index('times').groupby(pd.TimeGrouper('H')).mean()然后output.between_time('11:00', '12:00')只使用了我想要的两个小时。我正在努力搞清楚的是,如果有办法选择12:00:00,但如果没有,11:00:00是使用的,如果可能的话。以下是输出代码段的内容:

times                   A           B           C           D
1996-12-04 11:00:00     NaN     0.081826    0.112259    0.134100    
1996-12-04 12:00:00     NaN     0.080180    0.107108    0.126118    
....
2017-01-15 11:00:00     0.246591    0.309864    0.332677    0.362805    
2017-01-15 12:00:00     0.242433    0.301287    0.325492    0.355687    
2017-01-16 11:00:00     0.131201    0.155804    0.170489    0.180293    
2017-01-16 12:00:00     NaN     NaN     NaN     NaN     NaN     NaN     
2017-01-17 11:00:00     0.078308    0.093946    0.104750    0.110965    
2017-01-17 12:00:00     0.083883    0.097341    0.108580    0.114755    
2017-01-18 11:00:00     NaN     NaN     NaN     NaN     NaN     NaN     
2017-01-18 12:00:00     NaN     NaN     NaN     NaN     NaN     NaN     
2017-01-19 11:00:00     0.092868    0.109789    0.120100    0.125462    
2017-01-19 12:00:00     0.098974    0.113243    0.125806    0.130909    

我正在寻找的解决方案:

times                   A           B           C           D
1996-12-04 12:00:00     NaN     0.080180    0.107108    0.126118    
2017-01-15 12:00:00     0.242433    0.301287    0.325492    0.355687    
2017-01-16 11:00:00     0.131201    0.155804    0.170489    0.180293    
2017-01-17 12:00:00     0.083883    0.097341    0.108580    0.114755    
2017-01-19 12:00:00     0.098974    0.113243    0.125806    0.130909    

我假设我需要在if语句中使用for循环,但我刚开始学习Python,所以我还没有掌握它。

3 个答案:

答案 0 :(得分:1)

首先,如果需要,请按dropna删除所有NaN行。

然后groupby DatetimeIndex.datelast汇总。

必须使用reset_index set_index方法,因为在groupby日期之后会丢失时间。

df = df.dropna(how='all', axis=0)
df = df.reset_index().groupby(df.index.date).last().set_index('times')
print (df)
                            A         B         C         D
times                                                      
1996-12-04 12:00:00       NaN  0.080180  0.107108  0.126118
2017-01-15 12:00:00  0.242433  0.301287  0.325492  0.355687
2017-01-16 11:00:00  0.131201  0.155804  0.170489  0.180293
2017-01-17 12:00:00  0.083883  0.097341  0.108580  0.114755
2017-01-19 12:00:00  0.098974  0.113243  0.125806  0.130909

答案 1 :(得分:0)

您正在寻找的是拥有每组的第一个。想象一下,您要添加一列day和一列hour,然后您可以对这些值进行排序,按日期对它们进行分组,然后取出每个组的最后一个(如果可用则为12,否则为11)。

result = df.sort_values('hour').groupby('day').apply(lambda g: g[-1]).reset_index()

您可以在运行之前填写这些列,或者即时计算它们,例如

df.groupby(df['date'].apply(lambda x: x.date))

答案 2 :(得分:0)

如果要根据数据框中的值进行选择,可以使用

    df.reset_index().set_index('times').loc['12:00:00']

主要缺点:给定值必须在索引中。

输出:

            index       A           B           C           D
times                   
12:00:00    2017-01-15  0.242433    0.301287    0.325492    0.355687
12:00:00    2017-01-16  NaN         NaN         NaN         NaN
12:00:00    2017-01-17  0.083883    0.097341    0.108580    0.114755
12:00:00    2017-01-18  NaN         NaN         NaN         NaN
12:00:00    2017-01-19  0.098974    0.113243    0.125806    0.130909

如果您想给出时间间隔,您可以这样做:

df.reset_index().set_index('times').loc['12:00:00':'13:00:00']