Как интерполировать 100 значений в каждые два значения? - PullRequest
0 голосов
/ 11 марта 2019

Я хочу интерполировать 100 значений в каждые два значения (0,05 секунды, как в следующем «data.csv»), и должны остаться следующие данные без изменений.

 time         data
2013-02-12T02:58:00.047803  -1286
2013-02-12T02:58:00.097803  -1271
2013-02-12T02:58:00.147803  -1297
2013-02-12T02:58:00.197803  -1290
2013-02-12T02:58:00.247803  -1314
......

, и некоторый код:

import pandas as pd
from scipy import interpolate
import pylab as pl
import numpy as np

df = pd.read_csv('aa.txt', delim_whitespace=True)
xnew=np.linspace(df["time"],len(df["data"]),60)
f=interpolate.interp1d(df["time"],df["data"],kind="cubic")

ynew=f(xnew)
pl.plot(xnew,ynew,label="cubic", marker='.' )
pl.show()

1 Ответ

1 голос
/ 12 марта 2019

Ваша первая проблема заключается в том, что вам нужно правильно отформатировать значения времени, поскольку pandas загружает их в виде строк, например, вы можете преобразовать их в секунды.

Затем вы используете функцию np.linspace внеправильный путь.Сколько точек вы хотите рассчитать?

Вот пример кода:

import pandas as pd
from scipy import interpolate
import pylab as pl
import numpy as np
import dateutil
import datetime

time2seconds = lambda x:(dateutil.parser.parse(x)-datetime.datetime(1970,1,1)).total_seconds()
df = pd.read_csv('aa.txt', delim_whitespace=True)
df["time"] = map(time2seconds, df["time"])
xnew = np.linspace(start=min(df["time"]), stop=max(df["time"]), num=len(df["time"])*4)
f = interpolate.interp1d(df["time"], df["data"], kind="cubic")
ynew = f(xnew)
pl.plot(xnew, ynew, label="cubic", marker='.' )
pl.show()

- Edit - для отметок времени, которые вы, вероятно, хотите использовать pd.to_datetime

...