我想对我的数据重新采样,以便在每个索引的日期-时间之间每个间隔有512秒。我从pandas
中找到了resample
方法,但它不能正常工作,因为原始数据最终会被修改得太多(原始数据的真实性不一样(。然而,我考虑了一种可能性,如果在日期时间内,间隔只有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秒记录一次。所以,我想问你,这个领域的专家,你认为这是最适合我的情况的方法或算法吗?
第页。S.:我一直在寻找其他方法,比如重新采样,但更好,但我没有找到合适的方法。然而,我对新的想法持开放态度!请告诉我是否应该添加有关该问题的其他细节。
非常感谢。
通过resample()
不会丢失数据的真实性
- 重新创建了一个样本数据集,我在其中模拟了128s间隔的源数据
- 则
resample()
到512s桶 - 这可能意味着存在空桶,其中最后将为NaN,并且基础值的列表为空
- 在这种情况下,你需要决定你想做什么。对于上采样温度数据I
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),
dt.datetime(2019,5,1,4), freq="128s")
if random.randint(0,3) < 2 ] # miss some sample times... so resampling will give NaNs
df = 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
输出
last vals
ts
2019-05-01 01:59:28 27.0 [1, 41, 27]
2019-05-01 02:08:00 48.0 [14, 14, 48]
2019-05-01 02:16:32 43.0 [2, 49, 43]
2019-05-01 02:25:04 43.0 [43]
2019-05-01 02:33:36 44.0 [44]
2019-05-01 02:42:08 38.0 [39, 38]
2019-05-01 02:50:40 37.0 [37]
2019-05-01 02:59:12 25.0 [39, 25]
2019-05-01 03:07:44 1.0 [29, 8, 1]
2019-05-01 03:16:16 35.0 [12, 20, 35]
2019-05-01 03:24:48 33.0 [20, 33]
2019-05-01 03:33:20 5.0 [11, 5]
2019-05-01 03:41:52 NaN []
2019-05-01 03:50:24 9.0 [9]