【问题标题】:pandas DataFrame create 15minute overlapping intervalspandas DataFrame 创建 15 分钟的重叠间隔
【发布时间】:2020-02-22 07:29:32
【问题描述】:

我有一个 pandas DataFrame (df),包含以下列: ts_unix,val1,val2

我想添加一个名为 "15min_interval" 的新列,每个间隔是从每分钟开始的 15 分钟窗口。一个区间内的所有行在它们的区间列中将具有相同的区间(即前 15 行具有相同的区间值):

我尝试了循环遍历 15min_interval 值并在每个间隔之间为 Ts_unix 切片 df、连接所有 DataFrame 并创建 df_15min 的蛮力方法。处理时间太长。

我还尝试创建一个 date_time 列并使用 floor(15min) 但此方法创建不重叠的 15 分钟窗口并将起始值四舍五入到一小时的前 15 分钟。没用!

我想要一种更快的方法来创建重叠的 15 分钟间隔(每分钟重叠)

【问题讨论】:

  • 我很难在这里遵循您的逻辑。为什么第 15 行的时间间隔会发生变化?此外,将您的代码复制并粘贴为文本,而不是图片。 df.to_clipboard(False) 会将您的数据框的格式化版本复制到剪贴板,您可以将其粘贴到您的问题中

标签: python pandas dataframe time-series


【解决方案1】:

可能不是最干净的解决方案,但是:

In [1]: mins = pd.date_range(start='2019-06-29 07:10', end='2019-10-26 00:00', freq='min')
        unix_list = [int(ts.timestamp()) for ts in mins]
        df = pd.DataFrame({'ts_unix': unix_list, 'val1': np.random.random(len(unix_list)),
               'val2': np.random.random(len(unix_list))})
        df['ts_unix'] = pd.to_datetime(df['ts_unix'], unit='s')

        series_15mins = df.set_index('ts_unix', drop=True).resample('15min', loffset=datetime.timedelta(minutes=10)).sum().reset_index().ts_unix
        intervals = list()
        for j in series_15mins.index:
            if j > 0:
                intervals.append(15*[(int(series_15mins.loc[j-1].timestamp()), int(series_15mins.loc[j].timestamp()))])

        intervals = np.array(intervals).reshape(15*len(intervals), 2)
        intervals = intervals[:df.shape[0], :]
        df['15min_interval'] = list(intervals)
        df['ts_unix'] = df['ts_unix'].astype(np.int64)//10**9

结果:

In [2]: df.head(20)
Out[2]:     ts_unix     val1        val2        15min_interval
        0   1561792200  0.497049    0.296606    [1561792200, 1561793100]
        1   1561792260  0.789830    0.132583    [1561792200, 1561793100]
        2   1561792320  0.152093    0.869951    [1561792200, 1561793100]
        3   1561792380  0.631848    0.012687    [1561792200, 1561793100]
        4   1561792440  0.363599    0.685802    [1561792200, 1561793100]
        5   1561792500  0.678252    0.988140    [1561792200, 1561793100]
        6   1561792560  0.627432    0.502722    [1561792200, 1561793100]
        7   1561792620  0.860156    0.414428    [1561792200, 1561793100]
        8   1561792680  0.342857    0.686593    [1561792200, 1561793100]
        9   1561792740  0.004300    0.345949    [1561792200, 1561793100]
        10  1561792800  0.359219    0.178324    [1561792200, 1561793100]
        11  1561792860  0.818282    0.673142    [1561792200, 1561793100]
        12  1561792920  0.396736    0.642892    [1561792200, 1561793100]
        13  1561792980  0.022025    0.901829    [1561792200, 1561793100]
        14  1561793040  0.185680    0.158434    [1561792200, 1561793100]
        15  1561793100  0.813750    0.941224    [1561793100, 1561794000]
        16  1561793160  0.706645    0.504383    [1561793100, 1561794000]
        17  1561793220  0.844269    0.644725    [1561793100, 1561794000]
        18  1561793280  0.604586    0.043472    [1561793100, 1561794000]
        19  1561793340  0.174518    0.577738    [1561793100, 1561794000]

编辑: 每隔一小时开始十五分钟:

In [1]: mins = pd.date_range(start='2019-06-29 07:10', end='2019-10-26 00:00', freq='min')
        unix_list = [int(ts.timestamp()) for ts in mins]
        df = pd.DataFrame({'ts_unix': unix_list, 'val1': np.random.random(len(unix_list)), 'val2': np.random.random(len(unix_list))})
        df['15min_interval'] = [*zip(df.ts_unix, df.ts_unix+900)]
Out[1]:        ts_unix      val1        val2              15min_interval
        0   1561792200  0.945755    0.334230    (1561792200, 1561793100)
        1   1561792260  0.044156    0.851238    (1561792260, 1561793160)
        2   1561792320  0.924516    0.276829    (1561792320, 1561793220)
        3   1561792380  0.383580    0.237742    (1561792380, 1561793280)
        4   1561792440  0.782808    0.808183    (1561792440, 1561793340)

【讨论】:

  • 感谢您的回复。然而,这不是我要找的。您示例中的间隔不是重叠间隔。正确的时间间隔如下: [(1561792200, 1561793100), (1561792260, 1561793160), (1561792310, 1561793220)...] (15-minute window created at "every minute") 。因此,如果在添加“15-min_interval”列之前数据帧 df 的大小是 (14228,3) ,那么在添加间隔列之后它将是 (213315, 4)。谢谢!
  • 好的,我明白了。立即查看我编辑的答案。我不明白您如何以这种方式获得具有 213315 行的数据框?如果您从原始 df 的每一分钟开始有一个间隔,则生成的 df 将是相同的形状。
猜你喜欢
  • 2016-08-18
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多