从数据框中随机选择小时

时间:2019-08-19 12:21:59

标签: python pandas dataframe datetime random

我很难从数据框中随机选择行。通常,使用np.random.choice(data,size=1000)选择一行不是问题。我认为替换= True。但是,我需要随机选择一个小时并作为输出,接收每个季度的4行。

要选择的数据框如下(1132行):

data=
                     Price  Consume    Feed
StartTime                                  
2018-07-04 02:00:00  45.80    67.91   67.91
2018-07-04 02:15:00  45.80    51.05   51.05
2018-07-04 02:30:00  45.80    46.12   46.12
2018-07-04 02:45:00  45.80    46.86   46.86
2018-07-11 05:00:00  43.80    43.49   43.49
2018-07-11 05:15:00  43.80    50.71   50.71
2018-07-11 05:30:00  43.80    48.19   48.19
2018-07-11 05:45:00  43.80    40.02   40.02

我想要的输出是这样的:

假设随机生成器已“选择” 2018-07-11 05:00:00,则输出将为

2018-07-11 05:00:00  43.80    43.49   43.49
2018-07-11 05:15:00  43.80    50.71   50.71
2018-07-11 05:30:00  43.80    48.19   48.19
2018-07-11 05:45:00  43.80    40.02   40.02

根据随机样本的数量(N),结果数据帧的长度应为4xN。

是否可以直接从数据框中随机选择一天的时间并重复1000次?恐怕使用额外的数据框来选择一个小时,然后在原始数据框中查找相应的值会非常耗时。 我相信这在Python中应该可行,但是我找不到任何提示。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

我认为您将值与DatetimeIndex.floor进行比较以删除分钟和秒:

N = 1000
vals = pd.to_datetime(np.random.choice(df.index,size=N)).floor('H')
hours = df.index.floor('H')

for i in vals:
    print (df[hours == i])

编辑:要加入所有小型DataFrame,请使用concat

df1 = pd.concat([df[hours == i] for i in vals])

或使用np.concatenate中的DatetimeIndex创建数组,然后按loc进行选择:

idx = np.concatenate([df.index[hours == i] for i in vals])
df1 = df.loc[idx]

答案 1 :(得分:1)

采样一次以获取随机索引,然后查找该日期和小时的所有匹配项:

random_idx = df.sample().index
df[(df.index.date == random_idx.date) & (list(df.index.hour) == random_idx.hour)]

然后执行1000次:

for i in range(1000):
    random_idx = df.sample().index
    print(df[(df.index.date == random_idx.date) & (list(df.index.hour) == random_idx.hour)])