大家好 - 希望你们能帮忙,因为这是一项任务,我知道通过这里和在线上的各种帖子,我已经几乎掌握了它,但还没有完全让它工作。
本质上,我在数据库中有以下数据,通过psql.read_sql(sql, cnxn)返回到Pandas对象中:
+------------------------------------+
| StartTime StartLevel |
+------------------------------------+
| 0 2015-02-16 00:00:00 480.000 |
| 1 2015-02-16 00:30:00 480.000 |
| 2 2015-02-16 00:34:00 390.000 |
| 3 2015-02-16 01:00:00 390.000 |
| 4 2015-02-16 01:30:00 390.000 |
| 5 2015-02-16 02:00:00 480.000 |
| 6 2015-02-16 02:17:00 420.000 |
+------------------------------------+
StartTime datetime64[ns]
StartLevel float64
dtype: object
我希望能够得到上述数据的逐分钟插值。
我也已经创建了一个按分钟频率的日期时间序列,但是我无法弄清楚如何将我的表格“映射”到这个序列,然后进行插值,或者如何将StartTime重新采样为分钟粒度,然后插值缺失的数据。
任何帮助都将不胜感激(我相信当我找到解决方案时,我一定会自责!) - 非常感谢。
更新
根据下面的建议,代码如下:
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)
在提示符处,new_df 的输出为:
+-----------------------------------------------+
| StartTime fake_val StartLevel |
+-----------------------------------------------+
| 0 2015-02-16 00:00:00 NaN 480 |
| 1 2015-02-16 00:01:00 NaN 480 |
| 2 2015-02-16 00:02:00 NaN 390 |
| 3 2015-02-16 00:03:00 NaN 390 |
| 4 2015-02-16 00:04:00 NaN 390 |
| 5 2015-02-16 00:05:00 NaN 480 |
| 6 2015-02-16 00:06:00 NaN 480 |
+-----------------------------------------------+
interpolate()
吗?可能你没有保存结果。从文档来看,它不会自动地就地进行操作,所以你可以像这样做:new_df = new_df.interpolate()
或者new_df.interpolate(inplace=True)
。我已经编辑了答案以反映这一点。 - sedavidw