来自(时间戳,值)元组列表的均匀间隔的一系列值

low*_*ame 1 python numpy python-imaging-library pandas

我被困在这个问题上,因为我不太确定如何提出这个问题,所以这是我最好的尝试!

我有一个元组列表,代表特定时间戳的温度读数。

[
  (datetime.datetime(2022, 11, 30, 8, 25, 10, 261853), 19.82),
  (datetime.datetime(2022, 11, 30, 8, 27, 22, 479093), 20.01),
  (datetime.datetime(2022, 11, 30, 8, 27, 36, 984757), 19.96),
  (datetime.datetime(2022, 11, 30, 8, 36, 46, 651432), 21.25),
  (datetime.datetime(2022, 11, 30, 8, 41, 27, 230438), 21.42),
  ...
  (datetime.datetime(2022, 11, 30, 11, 57, 4, 689363), 17.8)
]
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,记录之间的差异无处不在 - 有些相隔几秒钟,而另一些则相隔几分钟。

从这些中,我想创建一个新的元组列表(或其他数据结构 - 我很高兴使用 NumPy 或 Pandas),其中时间戳值恰好每 5 分钟一次,而温度读数则计算为该时间戳的假设值鉴于可用数据。像这样的东西:

[
  (datetime.datetime(2022, 11, 30, 8, 25, 0, 0), ??),
  (datetime.datetime(2022, 11, 30, 8, 30, 0, 0), ??),
  (datetime.datetime(2022, 11, 30, 8, 35, 0, 0), ??),
  (datetime.datetime(2022, 11, 30, 8, 40, 0, 0), ??),
  ...
  (datetime.datetime(2022, 11, 30, 11, 30, 0, 0), ??),
]
Run Code Online (Sandbox Code Playgroud)

我的最终目标是能够使用 PIL 绘制这些数据,但不能使用 MatPlotLib,因为我的硬件非常有限。鉴于我手头上的数据不完善,我想在给定时间段内绘制一条平滑的温度线。

moz*_*way 5

假设lst输入列表,您可以使用:

import pandas as pd

out = (
 pd.DataFrame(lst).set_index(0).resample('5min')
   .mean().interpolate('linear')
   .reset_index().to_numpy().tolist()
)
Run Code Online (Sandbox Code Playgroud)

如果你真的想要一个元组列表:

out = list(map(tuple, out))
Run Code Online (Sandbox Code Playgroud)

输出:

[[Timestamp('2022-11-30 08:25:00'), 19.930000000000003],
 [Timestamp('2022-11-30 08:30:00'), 20.590000000000003],
 [Timestamp('2022-11-30 08:35:00'), 21.25],
 [Timestamp('2022-11-30 08:40:00'), 21.42],
 [Timestamp('2022-11-30 08:45:00'), 21.32717948717949],
 [Timestamp('2022-11-30 08:50:00'), 21.234358974358976],
 ...
 [Timestamp('2022-11-30 11:45:00'), 17.985641025641026],
 [Timestamp('2022-11-30 11:50:00'), 17.892820512820514],
 [Timestamp('2022-11-30 11:55:00'), 17.8]]
Run Code Online (Sandbox Code Playgroud)

对于日期时间类型:

out = (
 pd.DataFrame(lst).set_index(0).resample('5min')
   .mean().interpolate('linear')[1]
)

out = list(zip(out.index.to_pydatetime(), out))
Run Code Online (Sandbox Code Playgroud)

输出:

[(datetime.datetime(2022, 11, 30, 8, 25), 19.930000000000003),
 (datetime.datetime(2022, 11, 30, 8, 30), 20.590000000000003),
 (datetime.datetime(2022, 11, 30, 8, 35), 21.25),
 (datetime.datetime(2022, 11, 30, 8, 40), 21.42),
 (datetime.datetime(2022, 11, 30, 8, 45), 21.32717948717949),
 (datetime.datetime(2022, 11, 30, 8, 50), 21.234358974358976),
 ...
 (datetime.datetime(2022, 11, 30, 11, 45), 17.985641025641026),
 (datetime.datetime(2022, 11, 30, 11, 50), 17.892820512820514),
 (datetime.datetime(2022, 11, 30, 11, 55), 17.8)]
Run Code Online (Sandbox Code Playgroud)

重采样之前/之后:

在此输入图像描述