Pandas 数据框架中对数采样时间间隔的插值

3

我有一个pandas数据框,包含名称为“Time”的列和从数据记录器中提取的“Value”列。这些数据以对数时间间隔记录,意味着最初的值记录在分数分钟内,然后随着时间的推移,时间间隔变得更长:

print(df)
      Minutes   Value
0       0.001    0.00100
1       0.005    0.04495
2       0.010    0.04495
3       0.015    0.09085
4       0.020    0.11368
..        ...        ...
561  4275.150  269.17782
562  4285.150  266.90964
563  4295.150  268.35306
564  4305.150  269.42984
565  4315.150  268.37594

我想要在0到4315分钟之间每隔一分钟线性插值“Value”。

我尝试过几个不同的df.interpolate()迭代,但没有成功。有人可以帮帮我吗?谢谢。

2个回答

0

我认为我的问题可能非常基础,或者我提出了一个令人困惑的问题。无论哪种方式,我只是写了一个小循环来解决我的问题,并觉得我应该分享一下。我相信这不是完成我所要求的任务的最有效方法,希望有人能提出更好的方法。我还是很新手。

首先,有几个限定条件:

  1. 我所说的“Value”数据称为“drawdown”,它指的是水井内初始起始水位的水位差。它从0开始。

  2. 这种数据通常在半对数图中查看,有时将0替换为非常低的数字(即0.0001),以便在其他程序中轻松绘制。

此代码使用具有列名“Minutes”和“Drawdown”的.csv文件,并将时间值与从0到数据集结尾的新参考数据框中的分钟进行比较。它引用列表中所需时间值的2个最接近的时间值,并对这些值进行加权平均,然后创建一个新的整数分钟与drawdown的csv。

干杯!

# -*- coding: utf-8 -*-
"""
Created on Tue Sep 22 13:42:29 2020

@author: cmeyer
"""

import pandas as pd
import numpy as np

df=pd.read_csv('Read_in.csv')
length=len(df)-1
last=df.at[length,'Drawdown']
lengthpump=int(df.at[length,'Minutes'])
minutes=np.arange(0,lengthpump,1)
dfminutes=pd.DataFrame(minutes)
dfminutes.columns = ['Minutes']
for i in range(1, lengthpump, 1):

    non_uni_minutes=df['Minutes']
    uni_minutes=dfminutes.at[i,'Minutes']

    close1=non_uni_minutes[np.argsort(np.abs(non_uni_minutes-uni_minutes))[0]]
    close2=non_uni_minutes[np.argsort(np.abs(non_uni_minutes-uni_minutes))[1]]

    index1 = np.where(non_uni_minutes == close1)
    index1 = int(index1[0])
    index2 = np.where(non_uni_minutes == close2)
    index2 = int(index2[0])

    num1=df.at[index1,'Drawdown']
    num2=df.at[index2,'Drawdown']

    weight1 = 1-abs((i-close1)/i)
    weight2 = 1-abs((i-close2)/i)

    Value = (weight1*num1+weight2*num2)/(weight1+weight2)

    dfminutes.at[i,'Drawdown'] = Value
dfminutes.at[0,'Drawdown'] = 0.000001
dfminutes.at[0,'Minutes'] = 0.000001
dfminutes.to_csv('integer_minutes_drawdown.csv')

0

我在这里使用 numpy.interp 实现了高效的解决方案。我编写了一种比较花哨的方式,将数据从字符串读入 pandas.DataFrame 中,您可以根据需要使用任何更简单适合的方式,例如 pandas.read_csv(...)

在这里在线尝试下一段代码!

import math
import pandas as pd, numpy as np

# Here is just fancy way of reading data, use any other method of reading instead
df = pd.DataFrame([map(float, line.split()) for line in """
   0.001    0.00100
   0.005    0.04495
   0.010    0.04495
   0.015    0.09085
   0.020    0.11368
4275.150  269.17782
4285.150  266.90964
4295.150  268.35306
4305.150  269.42984
4315.150  268.37594
""".splitlines() if line.strip()], columns = ['Time', 'Value'])

a = df.values
# Create array of integer x = [0 1 2 3 ... LastTimeFloor].
x = np.arange(math.floor(a[-1, 0] + 1e-6) + 1)
# Linearly interpolate
y = np.interp(x, a[:, 0], a[:, 1])

df = pd.DataFrame({'Time': x, 'Value': y})
print(df)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接