猿问

重新采样数据以保持 Python 数据真实性的更好方法?

我想重新采样我的数据,以便每个索引的日期时间之间的每个间隔有 512 秒。找到了resample方法pandas,但是不能正常使用,因为最后会修改太多原始数据(原始数据的真实性不一样)。但是,我想到了一种可能性,如果在日期时间之内,间隔只有2个数字,它们也可以相互划分(512:4 = 128)。问题是它们的出现可以计算任意数量。

使用以下代码计算索引的间隔:

intervals = np.array(round(df.index.to_series().diff().dt.total_seconds().fillna(0)))

我的索引的间隔是这样的:(因为我的数据每 4 或 512 秒记录一次)

{4, 4, 4, 4, 4, 4, 4, 4, 4, 512,512, 512, 512, 512, 512, 512, 4, 4, 4, 4, 4, 512, 512, 512, 4, 4, 4, 4, 4, 4, 4, 4, 512, 4, 4, 4, 4, 512, 512, 521, 512, ...}

问题是有时数据每 4 秒记录一次,持续 5 分钟(因此没有足够的时间来达到 512)然后它可能会出现 512 等等,如上例所示。这是一个问题,因为我首先想到也许我应该每 512 秒循环一次,然后删除所有不在该间隔内的行。(我删除它们是因为我只需要每512秒记录一次数据,实际上没有必要知道它在间隔内是什么。它可能会增加,但它会改变很多。)我需要使其成为每 512 个,但不使用重采样方法,因为如果我观察得好,它会破坏数据的真实性。

总而言之,两个主要条件是:一是尊重并保持数据的真实性;二是最终每512秒记录一次数据。所以,我问你们,这个领域的专家,你们认为最适合我的情况的方法或算法是什么?

PS:我一直在寻找其他方法,比如 resample 但更好,但我没有找到合适的方法。但是,我愿意接受新想法!让我知道是否应该添加有关该问题的其他详细信息。

非常感谢。


炎炎设计
浏览 97回答 1
1回答

慕桂英4014372

不会丢失数据的真实性resample()已经重新创建了一个示例数据集,我在其中以128 秒的间隔模拟了源数据然后resample()到512s桶这可能意味着存在空桶,其中最后一个为NaN并且基础值列表为空你需要决定在这些情况下你想做什么。对于我对温度数据进行上采样的情况,我的dropna()其他选择显然是fillna()由于存在NaN您应该考虑dfr = df.resample("512s")["val"].agg(last="last", vals=lambda s: list(s)).astype({"last":"Int64"})维护列的数据类型(即从int64更改为float64)总之,源数据的完整性没有损失。您需要决定如何处理没有适合 *bin* 的基础数据的情况d = [d for d in pd.date_range(dt.datetime(2019,5,1,2),&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dt.datetime(2019,5,1,4), freq="128s")&nbsp;&nbsp; &nbsp; &nbsp;if random.randint(0,3) < 2 ] # miss some sample times... so resampling will give NaNsdf = pd.DataFrame({"ts":d, "val":[random.randint(0,50) for x in d]}).set_index("ts")dfr = df.resample("512s")["val"].agg(last="last", vals=lambda s: list(s))dfr输出&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;last&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; valsts&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2019-05-01 01:59:28&nbsp; 27.0&nbsp; &nbsp;[1, 41, 27]2019-05-01 02:08:00&nbsp; 48.0&nbsp; [14, 14, 48]2019-05-01 02:16:32&nbsp; 43.0&nbsp; &nbsp;[2, 49, 43]2019-05-01 02:25:04&nbsp; 43.0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [43]2019-05-01 02:33:36&nbsp; 44.0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [44]2019-05-01 02:42:08&nbsp; 38.0&nbsp; &nbsp; &nbsp; [39, 38]2019-05-01 02:50:40&nbsp; 37.0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [37]2019-05-01 02:59:12&nbsp; 25.0&nbsp; &nbsp; &nbsp; [39, 25]2019-05-01 03:07:44&nbsp; &nbsp;1.0&nbsp; &nbsp; [29, 8, 1]2019-05-01 03:16:16&nbsp; 35.0&nbsp; [12, 20, 35]2019-05-01 03:24:48&nbsp; 33.0&nbsp; &nbsp; &nbsp; [20, 33]2019-05-01 03:33:20&nbsp; &nbsp;5.0&nbsp; &nbsp; &nbsp; &nbsp;[11, 5]2019-05-01 03:41:52&nbsp; &nbsp;NaN&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; []2019-05-01 03:50:24&nbsp; &nbsp;9.0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[9]
随时随地看视频慕课网APP

相关分类

Python
我要回答