python - 时间序列重采样

标签 python numpy pandas time-series

我有以下形式的数据集 dropbox download (23kb csv)

数据的采样率每秒从 0Hz 到超过 200Hz 在某些情况下变化,提供的数据集中的最高采样率约为每秒 50 个样本。

例如,当取样时,它们总是均匀地分布在第二个

time                   x
2012-12-06 21:12:40    128.75909883327378
2012-12-06 21:12:40     32.799224301545976
2012-12-06 21:12:40     98.932953779777989
2012-12-06 21:12:43    132.07033814856786
2012-12-06 21:12:43    132.07033814856786
2012-12-06 21:12:43     65.71691352191452
2012-12-06 21:12:44    117.1350194748169
2012-12-06 21:12:45     13.095622561808861
2012-12-06 21:12:47     61.295242676059246
2012-12-06 21:12:48     94.774064119961352
2012-12-06 21:12:49     80.169378222553533
2012-12-06 21:12:49     80.291142695702533
2012-12-06 21:12:49    136.55650749231367
2012-12-06 21:12:49    127.29790925838365

应该是

time                        x
2012-12-06 21:12:40 000ms   128.75909883327378
2012-12-06 21:12:40 333ms    32.799224301545976
2012-12-06 21:12:40 666ms    98.932953779777989
2012-12-06 21:12:43 000ms   132.07033814856786
2012-12-06 21:12:43 333ms   132.07033814856786
2012-12-06 21:12:43 666ms    65.71691352191452
2012-12-06 21:12:44 000ms   117.1350194748169
2012-12-06 21:12:45 000ms    13.095622561808861
2012-12-06 21:12:47 000ms    61.295242676059246
2012-12-06 21:12:48 000ms    94.774064119961352
2012-12-06 21:12:49 000ms    80.169378222553533
2012-12-06 21:12:49 250ms    80.291142695702533
2012-12-06 21:12:49 500ms   136.55650749231367
2012-12-06 21:12:49 750ms   127.29790925838365

是否有一种简单的方法来使用 pandas 时间序列重采样功能,或者是否有一些内置于 numpy 或 scipy 中的东西可以工作?

最佳答案

我认为没有内置的 pandas 或 numpy 方法/函数可以执行此操作。

但是,我更喜欢使用 python 生成器:

def repeats(lst):
    i_0 = None
    n = -1 # will still work if lst starts with None
    for i in lst:
        if i == i_0:
            n += 1
        else:
            n = 0
        yield n
        i_0 = i
# list(repeats([1,1,1,2,2,3])) == [0,1,2,0,1,0]

然后你可以把这个 generator into a numpy array :

import numpy as np
df['rep'] = np.array(list(repeats(df['time'])))

计算重复次数:

from collections import Counter
count = Counter(df['time'])
df['count'] = df['time'].apply(lambda x: count[x])

并进行计算(这是计算中成本最高的部分):

df['time2'] = df.apply(lambda row: (row['time'] 
                                 + datetime.timedelta(0, 1) # 1s
                                     * row['rep'] 
                                     / row['count']),
                 axis=1)

注意:要删除计算列,请使用 del df['rep']del df['count']

.

一种“内置”方式可以使用 shift 来完成它两次,但我认为这会有点困惑...

关于python - 时间序列重采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13783721/

相关文章:

python - 安装pycrypto时出错

python - numpy:将由 nans 分隔的一维 block 数组拆分为 block 列表

python - 在给定转移矩阵的情况下有效地将转移应用于状态矩阵

python - 如果单独的值与 Pandas 中的列表匹配,则更新单元格值

python - 在python中将字符串转换为逗号之间的几个int

python - 使用 python 驱动程序将数据传入和传出 C++ 代码

python - 如何在 jinja2 中按索引设置列表项

python - 迭代 ndarray 的某些(但不是全部)维度

python - Pandas - 如何合并两个 DataFrame

python - 在for循环中创建pandas dfs