Pandas Dataframe 日期时间切片与 Index vs MultiIndex
Posted
技术标签:
【中文标题】Pandas Dataframe 日期时间切片与 Index vs MultiIndex【英文标题】:Pandas Dataframe datetime slicing with Index vs MultiIndex 【发布时间】:2016-08-05 22:17:56 【问题描述】:使用单个索引数据框,我可以执行以下操作:
df2 = DataFrame(data='data': [1,2,3],
index=Index([dt(2016,1,1),
dt(2016,1,2),
dt(2016,2,1)]))
>>> df2['2016-01 : '2016-01']
data
2016-01-01 1
2016-01-02 2
>>> df2['2016-01-01' : '2016-01-01']
data
2016-01-01 1
当你给它一个完整的一天(即 2016-01-01)时,日期时间切片有效,当你给它一个部分日期时它也有效,比如只是年和月 (2016-01)。所有这些都很好,但是当您引入多索引时,它仅适用于完整日期。部分日期切片似乎不再起作用了
df = DataFrame(data='data': [1, 2, 3],
index=MultiIndex.from_tuples([(dt(2016, 1, 1), 2),
(dt(2016, 1, 1), 3),
(dt(2016, 1, 2), 2)],
names=['date', 'val']))
>>> df['2016-01-01 : '2016-01-02']
data
date val
2016-01-01 2 1
3 2
2016-01-02 2 3
好的,没关系,但是部分日期:
>>> df['2016-01' : '2016-01']
File "pandas/index.pyx", line 134, in pandas.index.IndexEngine.get_loc (pandas/index.c:3824)
File "pandas/index.pyx", line 154, in pandas.index.IndexEngine.get_loc (pandas/index.c:3704)
File "pandas/hashtable.pyx", line 686, in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12280)
File "pandas/hashtable.pyx", line 694, in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12231)
KeyError: '2016-01'
(我缩短了回溯)。
知道这是否可能吗?这是一个错误吗?有什么方法可以做我想做的事而不必诉诸于:
df.loc[(df.index.get_level_values('date') >= start_date) &
(df.index.get_level_values('date') <= end_date)]
非常感谢任何提示、cmets、建议等!我尝试了很多其他方法都无济于事!
【问题讨论】:
我认为在0.18.0
版本中它不起作用,但在 0.18.1
版本中可以实现 - see
【参考方案1】:
横截面应该可以工作:
df.xs(slice('2016-01-01', '2016-01-01'), level='date')
文档:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.xs.html
【讨论】:
这似乎确实有效,但它会删除多索引。有什么方法可以保存索引? 这会删除索引。 有一个drop_level
参数(默认设置为True
)。【参考方案2】:
使用 pandas IndexSlice 获得更优美的语法。
idx = pd.IndexSlice
df.loc[idx['2016-01-01':'2016-01-01', :], :]
记住 pandas 切片是包含左右两边的。
【讨论】:
以上是关于Pandas Dataframe 日期时间切片与 Index vs MultiIndex的主要内容,如果未能解决你的问题,请参考以下文章
将 Pandas DataFrame 切片成新的 DataFrame
Pandas fillna()不适用于DataFrame切片[重复]
切片 pandas 的 MultiIndex DataFrame