【问题标题】:Randomly select hour from dataframe从数据框中随机选择小时
【发布时间】:2019-08-19 12:21:59
【问题描述】:

我很难从数据框中随机选择行。一般来说,使用np.random.choice(data,size=1000) 选择一行是没有问题的。我假设替换=真。但是,我需要随机选择一个小时并作为输出,接收每个季度的 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 中应该是可行的,但我找不到任何提示。

感谢您的帮助!

【问题讨论】:

    标签: python pandas dataframe datetime random


    【解决方案1】:

    我认为您将值与 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])
    

    或使用DatetimeIndex 中的np.concatenate 创建数组并通过loc 选择:

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

    【讨论】:

    • 是的,我认为这是正确的方向。我注意到,我有点不清楚,因为在 N=1000 4000 行的情况下,最终的数据帧应该包含。您的建议会创建 N 个长度为 4 的数据帧。我将如何调整代码?
    【解决方案2】:

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

    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)])
    

    【讨论】:

      猜你喜欢
      • 2020-02-19
      • 2022-01-09
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 2013-04-02
      相关资源
      最近更新 更多