如何解决熊猫插值给出奇怪的结果
我正在使用 Pandas 对数据点进行时间插值,但是在重采样和插值时,使用不同的重采样率在相同的插值时间内得到不同的结果。
这是一个测试示例:
import pandas as pd
import datetime
data = pd.DataFrame({'time': list(map(lambda a: datetime.datetime.strptime(a,'%Y-%m-%d %H:%M:%S'),['2021-03-28 12:00:00','2021-03-28 12:01:40','2021-03-28 12:03:20','2021-03-28 12:05:00','2021-03-28 12:06:40','2021-03-28 12:08:20','2021-03-28 12:10:00','2021-03-28 12:11:40','2021-03-28 12:13:20','2021-03-28 12:15:00'])),'latitude': [44.0,44.00463175663968,44.00919766508212,44.01357245844425,44.0176360866699,44.02127701531401,44.02439529286458,44.02690530159084,44.02873811544965,44.02984339933479],'longitude': [-62.75,-62.74998054893869,-62.748902164559304,-62.74679419470262,-62.7437142666763,-62.739746727555016,-62.735000345048086,-62.72960533041183,-62.72370976436673,-62.717475524320704]})
data.set_index('time',inplace=True)
a = data.resample('20s').interpolate(method='time')
b = data.resample('60s').interpolate(method='time')
print(a.iloc[:18:3])
print(b.iloc[:6])
# --- OUTPUT --- #
latitude longitude
time
2021-03-28 12:00:00 44.000000 -62.750000
2021-03-28 12:01:00 44.002779 -62.749988 # <-- Different Values
2021-03-28 12:02:00 44.005545 -62.749765 # <-- Different Values
2021-03-28 12:03:00 44.008284 -62.749118 # <-- Different Values
2021-03-28 12:04:00 44.010948 -62.748059 # <-- Different Values
2021-03-28 12:05:00 44.013572 -62.746794
latitude longitude
time
2021-03-28 12:00:00 44.000000 -62.750000
2021-03-28 12:01:00 44.002714 -62.749359 # <-- Different Values
2021-03-28 12:02:00 44.005429 -62.748718 # <-- Different Values
2021-03-28 12:03:00 44.008143 -62.748077 # <-- Different Values
2021-03-28 12:04:00 44.010858 -62.747435 # <-- Different Values
2021-03-28 12:05:00 44.013572 -62.746794
a
数据框和 b
数据框应预测同一分钟的相同值,但在大多数情况下此时它们不同。
有谁知道是什么原因造成的?在绘制完整结果时,似乎在分钟上重新采样会导致 Pandas 忽略不在分钟上的时间戳中的数据(例如 12:01:40 和 12:03:20)。
解决方法
我的评论总结和一些解释:
如果将 data.resample('60s').asfreq()
与 data.resample('20s').asfreq()
进行比较,您可以观察发生了什么。虽然所有样本数据都适合 20 年代网格,但只有少数值保留在 60 年代网格中。 pandas resample interpolate is producing NaNs 基本上描述了问题。
重点是,pandas
重新采样并然后 进行插值。如果重采样导致数据丢失,则这些数据不可用于插值。如果您想利用最初拥有的所有数据,您需要进行插值,然后重置索引。你可以这样做
# let's create new indices,the desired index...
new_index_20s = pd.date_range(data.index.min(),data.index.max(),freq='20s')
# and a helper for interpolation; the combination of existing and desired index
tmp_index_20s = data.index.union(new_index_20s)
new_index_60s = pd.date_range(data.index.min(),freq='60s')
tmp_index_60s = data.index.union(new_index_20s)
# re-index to the helper index,# interpolate,# and re-index to desired index
a1 = data.reindex(tmp_index_20s).interpolate('index').reindex(new_index_20s)
b1 = data.reindex(tmp_index_60s).interpolate('index').reindex(new_index_60s)
现在您对结果时间序列达成一致:
print(a1.iloc[:18:3])
print(b1.iloc[:6])
latitude longitude
2021-03-28 12:00:00 44.000000 -62.750000
2021-03-28 12:01:00 44.002779 -62.749988
2021-03-28 12:02:00 44.005545 -62.749765
2021-03-28 12:03:00 44.008284 -62.749118
2021-03-28 12:04:00 44.010948 -62.748059
2021-03-28 12:05:00 44.013572 -62.746794
latitude longitude
2021-03-28 12:00:00 44.000000 -62.750000
2021-03-28 12:01:00 44.002779 -62.749988
2021-03-28 12:02:00 44.005545 -62.749765
2021-03-28 12:03:00 44.008284 -62.749118
2021-03-28 12:04:00 44.010948 -62.748059
2021-03-28 12:05:00 44.013572 -62.746794
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。