我有一个Pandas数据帧df1,这是一个为期一年的 5分钟时间序列,其中包含A-Z列。
df1.shape
(105121, 26)
df1.index
<class 'pandas.tseries.index.DatetimeIndex'>
[2002-01-02 00:00:00, ..., 2003-01-02 00:00:00]
Length: 105121, Freq: 5T, Timezone: None
我有第二个数据框df2,它是一个为期一年的每日时间序列(在同一时期内),具有匹配的列。第二帧的值是布尔值。
df2.shape
(365, 26)
df2.index
<class 'pandas.tseries.index.DatetimeIndex'>
[2002-01-02 00:00:00, ..., 2003-01-01 00:00:00]
Length: 365, Freq: D, Timezone: None
我想使用df2作为df1的花式索引,即“df1.ix [df2]”或其他类似的东西,这样我就可以获得每个日期的df1列的子集 - 即df2所说的那些是真的该日期(其上包含所有时间戳)。因此,结果的形状应该是(105121,宽度),其中宽度是布尔人所暗示的不同列的数量(宽度<= 26)。
目前,df1.ix [df2]仅部分有效。只选择每天的00:00值,这与df2的“点状”时间序列有关。
我接下来尝试将时间跨度作为df2索引:
df2.index
PeriodIndex: 365 entries, 2002-01-02 to 2003-01-01
这一次,我收到一个错误:
/home/wchapman/.local/lib/python2.7/site-packages/pandas-0.11.0-py2.7-linux-x86_64.egg/pandas/core/index.pyc in get_indexer(self, target, method, limit)
844 this = self.astype(object)
845 target = target.astype(object)
--> 846 return this.get_indexer(target, method=method, limit=limit)
847
848 if not self.is_unique:
AttributeError: 'numpy.ndarray' object has no attribute 'get_indexer'
我的临时解决方案是按日期循环,但这似乎效率低下。熊猫是否能够进行这种花式索引?我没有在文档中的任何地方看到示例。
答案 0 :(得分:0)
这是实现此目的的一种方法:
t_index = df1.index
d_index = df2.index
mask = t_index.map(lambda t: t.date() in d_index)
df1[mask]
稍快一点(但有相同的想法)就是使用:
mask = pd.to_datetime([datetime.date(*t_tuple)
for t_tuple in zip(t_index.year,
t_index.month,
t_index.day)]).isin(d_index)