根据时间戳的月份过滤数据帧

时间:2017-04-12 11:54:58

标签: python pandas dataframe timestamp

我有两个月的过滤器:

oct_may = [1,2,3,4,5,10,11,12]
jun_sep = [6,7,8,9]

假设我有一个这样的数据帧:

> Timestamp max con pf

3/21/2017 23:00 123 232 0.91
3/22/2017 0:00  122 232 0.91
8/22/2017 1:00  122 232 0.92
3/22/2017 2:00  121 232 0.91
3/22/2017 3:00  118 232 0.89
9/22/2017 4:00  120 232 0.9
3/22/2017 5:00  121 232 0.91
3/22/2017 6:00  123 232 0.89

我想从" con"获取数据列,基于上述两个过滤器(月oct_mayjun_sep)之间的月份。

我已尝试df.loc[df.index.month],但我无法获取数据。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

我认为您首先需要将索引转换为DatetimeIndex.month,然后使用np.in1d进行检查,因为DatetimeIndex.month的输出为numpy array

#if necessary
#df.index= pd.to_datetime(df.index)

print (type(df.index.month))
<class 'numpy.ndarray'>

df1 = df[np.in1d(df.index.month, oct_may)]
print (df1)
                     max  con    pf
Timestamp                          
2017-03-21 23:00:00  123  232  0.91
2017-03-22 00:00:00  122  232  0.91
2017-03-22 02:00:00  121  232  0.91
2017-03-22 03:00:00  118  232  0.89
2017-03-22 05:00:00  121  232  0.91
2017-03-22 06:00:00  123  232  0.89

df2 = df[np.in1d(df.index.month, jun_sep)]
print (df2)
                     max  con    pf
Timestamp                          
2017-08-22 01:00:00  122  232  0.92
2017-09-22 04:00:00  120  232  0.90

对于纯pandas解决方案,转换为Series并与isin进行比较:

df1 = df[pd.Series(df.index.month, index=df.index).isin(oct_may)]
print (df1)
                     max  con    pf
Timestamp                          
2017-03-21 23:00:00  123  232  0.91
2017-03-22 00:00:00  122  232  0.91
2017-03-22 02:00:00  121  232  0.91
2017-03-22 03:00:00  118  232  0.89
2017-03-22 05:00:00  121  232  0.91
2017-03-22 06:00:00  123  232  0.89

答案 1 :(得分:2)

为了使用loc,您需要生成布尔掩码或索引中的事物列表。但是,如果你创建一个布尔掩码,它在语法上更容易放弃df.loc[mask]并只使用df[mask]

这是使用loc和索引的解决方案

df.set_index(
    df.index.month, append=True
).sort_index().loc[pd.IndexSlice[:, oct_may], :].reset_index(1, drop=True)

                     max  con    pf
Timestamp                          
2017-03-21 23:00:00  123  232  0.91
2017-03-22 00:00:00  122  232  0.91
2017-03-22 02:00:00  121  232  0.91
2017-03-22 03:00:00  118  232  0.89
2017-03-22 05:00:00  121  232  0.91
2017-03-22 06:00:00  123  232  0.89

在我看来,这很难看。

使用面具是可行的方法。

df[df.index.to_series().dt.month.isin(oct_may)]
​
                     max  con    pf
Timestamp                          
2017-03-21 23:00:00  123  232  0.91
2017-03-22 00:00:00  122  232  0.91
2017-03-22 02:00:00  121  232  0.91
2017-03-22 03:00:00  118  232  0.89
2017-03-22 05:00:00  121  232  0.91
2017-03-22 06:00:00  123  232  0.89