在Pandas中的多索引数据帧中选择日期时间范围

2024-09-25 12:36:46 发布

您现在位置:Python中文网/ 问答频道 /正文

问题是:

首先,我想选择数据帧(例如,df3),df1中的每个index1都在d_reachd_start之间

其次,我想得到满足两个条件的数据帧(比如,df4):

  1. df中的索引在df3中的索引之间的范围内
  2. {}和{}保持不变

下面是生成示例的代码:

import numpy as np
import pandas as pd
import datetime
from datetime import timedelta

index = pd.date_range(datetime.datetime(2021, 1, 1, 1, 0), periods = 20160, freq = "10s")

data = {'id1': np.tile(np.repeat([0,1], 42), 240), 'id2': np.tile(np.repeat([2,4,6,8], 60), 84)}

df = pd.DataFrame(data, index = index)

index1 = pd.date_range(datetime.datetime(2021, 1, 1, 1, 1), periods = 1000, freq = "3min")

df1 = pd.DataFrame(np.random.random(1000), index = index1, columns = ['r'])

d_start = pd.date_range(datetime.datetime(2021, 1, 1, 1, 1), periods = 500, freq = "5min")

d_reach = d_start + timedelta(seconds = np.random.randint(low = 4, high = 6))

value = {'id3': np.tile([0,1], 250)}

df2 = pd.DataFrame(value, index = [d_start,d_reach])

df2.index.names = ['d_start','d_reach']

虽然我已经知道了如何执行第二步(参见下面的Python脚本),但我已经为第一步奋斗了好几个星期

df.sort_index(inplace=True)
df3.sort_index(inplace=True)

df4 = (
  pd
  .concat([
    df.loc[idx1:idx2].iloc[:-1]
    for idx1, idx2 in zip(df3.index.tolist()[:-1], df3.index.tolist()[1:])
    if df.loc[idx1:idx2]['id1'].pipe(lambda s: s == s[0]).all() 
    and df.loc[idx1:idx2]['id2'].pipe(lambda s: s == s[0]).all()
  ])
)

df2是多索引的

df3的预期输出应为:

2021-01-01 01:07:00     0.011026

2021-01-01 01:10:00     0.423813
...

这里index1df1{}中,这是df2中的d_reach之一 和{}{}中的下一个{},这是{}中的下一个{}

非常感谢任何关于在Python中查找df3的建议。谢谢


Tags: importdfdatetimedateindexnpstartpd