我有一个熊猫数据框,其中以分钟为单位的“时间”列和从数据记录器中提取的“值”。数据以对数时间间隔记录,这意味着第一个值以小数分钟记录,然后随着时间的推移,时间间隔变长:
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分钟之间以一分钟的间隔线性插值'值'。
我尝试了df.interpolate()的一些不同迭代,但是没有成功。有人可以帮我吗?谢谢
答案 0 :(得分:0)
我认为我的问题很基本,或者我提出了一个令人困惑的问题。无论哪种方式,我都只写了一个小循环来解决我的问题,觉得自己应该分享它。我确信这不是我所要求的最有效的方式,希望有人可以提出更好的方法来实现这一目标。这整个事情我还是很新。
首先要进行一些合格的事情:
我所说的“价值”数据称为“亏损”,是指水位与水井中初始初始水位之间的差异。从0开始。
此类数据通常在半对数图中查看,有时可以更容易地将0替换为极低的数字(即0.0001),以便在其他程序中轻松绘制。
此代码采用列名为“ Minutes”和“ Drawdown”的.csv文件,并将时间值与从0到数据集结尾的新的分钟参考数据帧进行比较。它将2个最接近的时间值引用到列表中所需的时间值,并对这些值进行加权平均,然后创建一个新的带有分钟数的整数分钟的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')
答案 1 :(得分:0)
在这里,我使用numpy.interp实现了有效的解决方案。我已经编码了一种从字符串中读取数据到void
中的奇特方式,您可以使用任何更简单的合适方式来满足您的需求,例如pandas.DataFrame
。
pandas.read_csv(...)