python - Pandas :合并两个索引列

标签 python pandas

我有以下 Pandas 系列:

data = {(pd.Timestamp('2016-01-01 00:00:00'), datetime.time(0, 0)): 6.885,
        (pd.Timestamp('2016-01-01 00:00:00'), datetime.time(0, 5)): 6.363, 
        (pd.Timestamp('2016-01-01 00:00:00'), datetime.time(0, 10)): 6.093,
        (pd.Timestamp('2016-01-01 00:00:00'), datetime.time(0, 15)): 6.768, 
        (pd.Timestamp('2016-01-01 00:00:00'), datetime.time(0, 20)): 7.11}
s = pd.Series(data)

2016-01-01  00:00:00    6.885
            00:05:00    6.363
            00:10:00    6.093
            00:15:00    6.768
            00:20:00    7.110
dtype: float64

我怎样才能组合这两个索引列来创建一个 DatetimeIndex,如下所示:

2016-01-01 00:00:00    6.885
2016-01-01 00:05:00    6.363
2016-01-01 00:10:00    6.093
2016-01-01 00:15:00    6.768
2016-01-01 00:20:00    7.110
dtype: float64

最佳答案

直观的答案
使用 pd.Index.mappd.Timedelta

s.index = s.index.map(lambda t: t[0] + pd.Timedelta(str(t[1])))
s

2016-01-01 00:00:00    6.885
2016-01-01 00:05:00    6.363
2016-01-01 00:10:00    6.093
2016-01-01 00:15:00    6.768
2016-01-01 00:20:00    7.110
dtype: float64

快速回答
如果速度是你的追求,试试这个

t = np.array(
    [t.hour * 60 + t.minute for t in s.index.get_level_values(1)],
    'timedelta64[m]'
)

s.index = s.index.get_level_values(0) + t

2016-01-01 00:00:00    6.885
2016-01-01 00:05:00    6.363
2016-01-01 00:10:00    6.093
2016-01-01 00:15:00    6.768
2016-01-01 00:20:00    7.110
dtype: float64

时间测试

请注意,这在您关心优化的情况下。否则,请使用您认为正确的选择。

jez = lambda s: s.index.get_level_values(0) + pd.to_timedelta(s.index.get_level_values(1).astype(str))
pir1 = lambda s: s.index.map(lambda t: t[0] + pd.Timedelta(str(t[1])))
pir2 = lambda s: s.index.get_level_values(0) + np.array([t.hour * 60 + t.minute for t in s.index.get_level_values(1)], 'timedelta64[m]')

res = pd.DataFrame(
    np.nan, [10, 30, 100, 300, 1000, 3000, 10000, 30000],
    'jez pir1 pir2'.split()
)

for i in res.index:
    s_ = pd.concat([s] * i)
    for j in res.columns:
        stmt = f'{j}(s_)'
        setp = f'from __main__ import {j}, s_'
        res.at[i, j] = timeit(stmt, setp, number=100)

res.plot(loglog=True)

enter image description here

res.div(res.min(1), 0)

             jez       pir1  pir2
10      2.400808   3.530032   1.0
30      4.045287   8.378484   1.0
100     6.337601  18.610263   1.0
300     8.664829  30.363422   1.0
1000   11.593935  44.210358   1.0
3000   11.899037  47.425953   1.0
10000  12.226166  49.546467   1.0
30000  12.543602  50.730653   1.0

关于python - Pandas :合并两个索引列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49217747/

相关文章:

python - 将 DataFrame 中的值替换为 None

python - 在带有范围的 for 循环的最后一次迭代中获取余数

python - 使用 python 抓取图像并更改其名称

python - 从 datetime.time 对象中减去时间

Python - 将整数字符串转换为 Ascii

python - 如何获取一列中所有唯一的值组合,这些值在另一列中

python - Pandas Python 数据帧关联规则的事务 ID 列。

python - django rest 框架中的序列化程序

python - 合并具有非唯一索引的多个数据帧

python - 生成具有数字范围的条件组合的数据框