pandas (时间戳、值)元组列表中的等间距值序列

cgh8pdjw  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(130)

我在这个问题上卡住了,因为我不太确定如何问这个问题,所以这是我最好的尝试!
我有一个元组列表,它表示在特定时间戳的温度阅读。

[
  (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)
]

正如您所看到的,记录之间的增量到处都是-有些相隔几秒钟,而有些相隔几分钟。
从这些数据中,我想创建一个新的元组列表(或其他数据结构--我很乐意使用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), ??),
]

我的最终目标是能够使用PIL而不是MatPlotLib来绘制这些数据,因为我使用的是非常受限的硬件。我希望在给定的时间段内绘制一条平滑的温度线,因为我手头的数据并不完美。

sczxawaw

sczxawaw1#

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

import pandas as pd

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

如果确实需要元组列表:

out = list(map(tuple, out))

输出量:

[[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]]

对于日期时间类型:

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

out = list(zip(out.index.to_pydatetime(), out))

输出量:

[(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)]

重新采样之前/之后:

相关问题