当前位置:   article > 正文

给定横坐标插值获得纵坐标(包含时间序列插值)Python_python中如何将一个函数的纵坐标的某一个值与它对应的横坐标用虚线连接起来

python中如何将一个函数的纵坐标的某一个值与它对应的横坐标用虚线连接起来

在处理二维数据时,对于在原本在数据集中不存在的数据,我们经常需要利用插值获得其值,恰巧本人最近做时间序列的时候,需要插值得到一些原本不存在的时间处的值,自己写个小博客记录一下。首先是一般序列,然后是日期的序列,最后是任意时间的序列

1. 一般序列

我们举 cos ⁡ ( ) \cos() cos()函数的图像为例

import numpy as np

x = np.arange(-5, 5, 0.05)
y = np.cos(x)
  • 1
  • 2
  • 3
  • 4

然后插值获得 x = 2.017 x=2.017 x=2.017处的值,这样就需要插值了。在求插值的时候我用到的是np.interp函数,这个函数只需要输入指定的 x x x以及已经有的 x , y x,y x,y的两个列表就可以得到插值的 y y y
关于np.interp的更多介绍,请参考官方文档:

https://numpy.org/doc/stable/reference/generated/numpy.interp.html

为了方便显示,下面会绘图显示出来插值的点

import matplotlib.pyplot as plt

plt.plot(x, y)
plt.plot(2.017, np.interp(2.017, x, y), 'r*')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5

得到下图
在这里插入图片描述
其中的红色※号点就是我们根据横坐标2.017借助np.interp得到的插值点

2. 日期序列

我也有看到好像可以借助pandas有interp的包可以处理这个问题,但是我这里用np.interp照样可以处理,只不过需要首先把日期格式转换为整数类型的横坐标(这里我用到的是int(日期方法)),这是因为np.interp的输入 x − l i s t x- list xlist只可以是整数类型的

import datetime
import numpy as np
import matplotlib.pyplot as plt

# 获得原始序列,x为日期格式
xdate = []
y = []

begin = datetime.date(2020,1,1)

# 每隔两天有一个数据,所以2020.10.02的数据是空缺的
for i in range(180):
    day = begin + datetime.timedelta(days=2*i)
    xdate.append(day)
    y.append(np.cos(i/50 * np.pi))

# 转化为整数
xdate_int = [int(t.strftime("%Y%m%d")) for t in xdate]

# 需要插值的点
day = datetime.date(2020,10,2)
# 转化为时间整数,因为datatime没法插值
x_day_int = int(day.strftime("%Y%m%d"))
# 用np方法插值的时间获得y
xday_y = np.interp(x_day_int, xdate_int, y)
    
    
plt.plot(xdate, y)
plt.plot(day, xday_y, 'r*')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

得到的图和插值点如下,
在这里插入图片描述
原本2020.10.02这一天的数据是没有的,但是可以通过插值得到

3.一般的时间序列

对于一般的时间序列,我这里是转化为np.datetime64的格式之后转化为int64的整数的,这样就可以继续调用np.interp方法了✌️

import datetime
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 获得原始序列,xtimelist为一般的时间格式
xtimelist = pd.date_range('2020-01-01 00:00:00', '2020-01-01 05:00:00', freq= '1min')

y = []
for i in range(len(xtimelist)):
    y.append(np.cos(i/60 * np.pi))

# 转化为整数
xtimelist_int = [np.datetime64(t).astype(np.int64) for t in xtimelist]

# 需要插值的点
x_time = np.datetime64('2020-01-01 03:21:07.000000')
# 转化为时间整数,因为datatime没法插值
x_time_int = x_time.astype(np.int64)


# 用np方法插值的时间获得y
x_time_y = np.interp(x_time_int, xtimelist_int, y)

plt.plot(xtimelist, y)
plt.plot(x_time, x_time_y, 'r*')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

结果和插值点如下图所示,
在这里插入图片描述
就这样我们获得了一个特殊时刻(2020-01-01 03:21:07.000000,注意这里的.000000是必须的)的纵坐标

4. Summary

总结来讲,就是要先把横纵坐标都转化为整数,调用numpy包里的interp方法插值获得已知 x x x相对应的 y y y值的

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/545312
推荐阅读
相关标签
  

闽ICP备14008679号