我有两个月的过滤器:
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_may
和jun_sep
)之间的月份。
我已尝试df.loc[df.index.month]
,但我无法获取数据。
我怎样才能做到这一点?
答案 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