python - 在多索引中移动时间以合并
问题描述
我想合并两个由time
和索引的数据集id
。问题是,每个数据集中的时间略有不同。在一个数据集中,时间(每月)是月中,因此是每个月的 15 日。在另一个数据集中,这是最后一个工作日。这应该仍然是一对一的匹配,但日期并不完全相同。
我的方法是将月中日期转移到工作日的月底日期。
数据:
dt = pd.date_range('1/1/2011','12/31/2011', freq='D')
dt = dt[dt.day == 15]
lst = [1,2,3]
idx = pd.MultiIndex.from_product([dt,lst],names=['date','id'])
df = pd.DataFrame(np.random.randn(len(idx)), index=idx)
df.head()
输出:
0
date id
2011-01-15 1 -0.598584
2 -0.484455
3 -2.044912
2011-02-15 1 -0.017512
2 0.852843
这就是我想要的(我删除了性能警告):
In[83]:df.index.levels[0] + BMonthEnd()
Out[83]:
DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31', '2011-04-29',
'2011-05-31', '2011-06-30', '2011-07-29', '2011-08-31',
'2011-09-30', '2011-10-31', '2011-11-30', '2011-12-30'],
dtype='datetime64[ns]', freq='BM')
但是,索引是不可变的,所以这不起作用:
In: df.index.levels[0] = df.index.levels[0] + BMonthEnd()
TypeError: 'FrozenList' does not support mutable operations.
我唯一的解决方案是重置索引(),更改日期,然后再次设置索引():
df.reset_index(inplace=True)
df['date'] = df['date'] + BMonthEnd()
df.set_index(['date','id'], inplace=True)
这给了我想要的东西,但这是最好的方法吗?是否有 set_level_values() 函数(我在 API 中没有看到)?
或者,也许我对合并采取了错误的方法。我可以将数据集与 keys 合并df.index.get_level_values(0).year
,但这似乎并没有好多少 df.index.get_level_values(0).month
。id
解决方案
您可以再次构建它:
df.index = pd.MultiIndex.from_arrays(
[
df.index.get_level_values(0) + BMonthEnd(),
df.index.get_level_values(1)
])
set_levels
隐式重建索引。如果您有两个以上的级别,则此解决方案会变得笨拙,因此请考虑使用set_levels
简洁的打字方式。
推荐阅读
- python - 在多个条件下在 For 循环中过滤 pandas DataFrame 的更快方法
- react-native - 在我的博览会反应原生应用程序中添加飞溅时出错
- docker - 为什么我在 docker 网络示例中看到 172.22.0.3?
- django - Django 从 ManyToManyField 表单中获取对象的数据
- java - 为什么有些行用绿色矩形突出显示以及如何在 intellij IDEA 中将其关闭
- java - Java ObjectInpuStream 读取 DefaultTableModel
- python - 为什么我得到“str”对象不可调用错误
- methods - 无论如何,“context”和“with_context”有什么区别?
- go - 为什么 float 32 和 float64 在 go 中打印为整数?
- python - 在 Python 中使用 Selenium 禁用 Chrome“此浏览器正在由自动测试软件控制”时出现问题