Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中插入缺少的值_Python_Scipy_Linear Interpolation_Pandasql - Fatal编程技术网

在Python中插入缺少的值

在Python中插入缺少的值,python,scipy,linear-interpolation,pandasql,Python,Scipy,Linear Interpolation,Pandasql,总之,我希望你能帮上忙,因为我知道这是我从这里和网上的各种帖子中几乎破解的任务之一,但还没有完全成功 基本上,我在数据库中有以下数据,这些数据通过psql.read_sql(sql,cnxn)返回给Pandas对象 我只想以上述数据的逐分钟插值结束 我还创建了一个以分钟为频率的日期时间序列,但就我的一生而言,我无法将我的表“映射”到这一点,然后进行插值,或者如何将开始时间重新采样到分钟粒度,然后对缺失的数据进行插值 任何帮助都将不胜感激(我确信当我找到解决方案时,我会踢自己!)-非常感谢 更新

总之,我希望你能帮上忙,因为我知道这是我从这里和网上的各种帖子中几乎破解的任务之一,但还没有完全成功

基本上,我在数据库中有以下数据,这些数据通过psql.read_sql(sql,cnxn)返回给Pandas对象

我只想以上述数据的逐分钟插值结束

我还创建了一个以分钟为频率的日期时间序列,但就我的一生而言,我无法将我的表“映射”到这一点,然后进行插值,或者如何将开始时间重新采样到分钟粒度,然后对缺失的数据进行插值

任何帮助都将不胜感激(我确信当我找到解决方案时,我会踢自己!)-非常感谢

更新

根据以下建议,代码如下:

import datetime
import numpy as np
import pandas as pd
import pyodbc
import pandas.io.sql as psql


cnxn = pyodbc.connect('DSN=MySQL;DATABASE=db;UID=uid;PWD=pwd')
cursor = cnxn.cursor()
sql = """
    SELECT
    StartTime,StartLevel
FROM
    aa.bb
    where cc = 'dd'
    and StartTime < '2015-02-16 02:30:00'
    order by StartTime asc"""

old_df = psql.read_sql(sql, cnxn)


num_minutes = 120
base = datetime.datetime(2015, 02, 16, 00, 00, 00)
date_list = [base + datetime.timedelta(minutes=x) for x in range(0, num_minutes)]
# set num_minutes for whatever is the correct number of minutes you require
new_data = [dict(StartTime=d, fake_val=np.NaN) for d in date_list]
new_df = pd.DataFrame(new_data)
new_df['StartLevel'] = old_df['StartLevel']
new_df.interpolate(inplace=True)

我很确定这不是最符合python的答案,所以我欢迎评论来改进它,但我相信你可以这样做

首先创建所有要为其设置值的datetime对象

num_minutes = 120
base = datetime.datetime(2015, 02, 16, 00, 00, 00)
date_list = [base + datetime.timedelta(minutes=x) for x in range(0, num_minutes)]
# set num_minutes for whatever is the correct number of minutes you require
然后用这些索引值创建一个“假”数据帧

new_data = [dict(StartTime=d, fake_val=np.NaN) for d in date_list]
new_df = pd.DataFrame(new_data)
编辑:更正的回复

现在我们要将两个数据帧合并为一个(并按日期排序):

final_df
现在将按日期排序,并在有数据时包含正确的
StartLevel
值,在没有数据时包含正确的
NaN
。然后,您可以调用
interpolate

EDIT:Interpolate默认情况下不调用
inplace
,因此您需要设置该标志或保存结果

final_df = final_df.interpolate()

显然,
fake\u val
列在合并好数据后会被抛出。创建该数据帧的目的是让一个数据帧包含您想要的所有值(这就是我确信有一个更符合python的答案的地方)


interpolate
的完整文档可以找到

感谢您的建议,但它不太管用,因为它生成了按分钟计算的时间列表,一个带有NaN的列,然后简单地将原始开始时间映射到this@PatrickA您是否调用了
interpolate()
?您可能没有保存查看文档的结果,因为它不会自动执行此操作,所以您可以执行类似于
new\u df=new\u df.interpolate()
new\u df.interpolate(inplace=True)
的操作。我编辑了答案以反映这一点,我相信是这样的。它在伪值列中生成正确的逐分钟时间序列和NaN。它似乎也在一分钟一分钟地插入最后一个值,直到最后一分钟结束,但没有插入惊人级别-我想在这里为您发布输出,但我不确定如何to@PatrickA你能编辑你的问题并把它放在那里吗?如果你能把你用过的代码包括进来,那会对你很有帮助的。在原始问题中贴出来
new_data = [dict(StartTime=d, fake_val=np.NaN) for d in date_list]
new_df = pd.DataFrame(new_data)
final_df = new_df.merge(df, how='outer', on='date').sort(columns='date')
final_df = final_df.interpolate()
final_df.interpolate(inplace=True)