python 具有多列的插值CSV文件

8ehkhllq  于 2022-11-28  发布在  Python
关注(0)|答案(1)|浏览(209)

我有一个包含以下格式数据的CSV文件:

[(    7, 1818,  1,  8, 1818.021, 65, 10.2,  1, 1)
 (   12, 1818,  1, 13, 1818.034, 37,  7.7,  1, 1)
 (   16, 1818,  1, 17, 1818.045, 77, 11.1,  1, 1) ...
 (73715, 2019, 10, 29, 2019.826,  0,  0. , 30, 0)
 (73716, 2019, 10, 30, 2019.829,  0,  0. , 24, 0)
 (73717, 2019, 10, 31, 2019.832,  0,  0. , 28, 0)]

每列对应不同的数据。第二列对应年份。我必须在1900年到2000年的1000个时间步中插入所有数据。困难在于这是一个CSV文件,有多列,我必须在1000个时间步中插入每一列。
我首先用这段代码收集了1900年到2000年的所有数据:

index1 = np.where(arr['year']==1900)[0][0]
index2 = np.where(arr['year']==2000)[0][-1]
data = arr[index1:index2]

其给出:

[(29950, 1900,  1,  1, 1900.001,  12,  3. ,  1, 1)
 (29951, 1900,  1,  2, 1900.004,  12,  3. ,  1, 1)
 (29952, 1900,  1,  3, 1900.007,   3,  2. ,  1, 1) ...
 (66836, 2000, 12, 28, 2000.99 , 162,  7. , 13, 1)
 (66837, 2000, 12, 29, 2000.993, 151, 11.7, 15, 1)
 (66838, 2000, 12, 30, 2000.996, 152, 10.6, 11, 1)]

这段数据的长度是36889。现在我需要在1000个时间步中插入这段数据。
我不知道该怎么做,我一直在反复使用scipy中的np.interpd()和interp1d,但是我一直被卡住了,因为没有明确的例子来说明如何对csv文件中的每一列执行此操作。
我希望这件事不要有Pandas,也不要形成循环。

igsr9ssn

igsr9ssn1#

以下是如何使用某些整数索引值进行插值的示例:

#!/usr/bin/env ipython
import numpy as np
import pandas as pd
import datetime
# --------------------------------------------------------------
# let us generate the sample data, similar to data in question:
dvec = [datetime.datetime(1818,1,1)+ii*datetime.timedelta(days=1) for ii in range(200*365)]
# --------------------------------------------------------------
yy = [vv.year for vv in dvec]
mm = [vv.month for vv in dvec]
dd = [vv.day for vv in dvec]
c1 = np.random.random(np.size(yy))
c2 = np.random.random(np.size(yy))
c3 = np.random.random(np.size(yy))
datain = np.vstack((yy,mm,dd,c1,c2,c3)).T
# --------------------------------------------------------------
# let us convert our data to pandas dataframe:
ddict = {ii:datain[:,ii] for ii in range(datain.shape[1])}
# we can also add just some index values for the interpolation:
# --------------------------------------------------------------
# let us interpolate to wished values using integer values:
kk = [kk for kk,val in enumerate(dvec,1) if val.year>=1900 and val.year<2000]
iout = np.linspace(kk[0],kk[-1],1000)
ddict['index'] = np.linspace(1,datain.shape[0],datain.shape[0])
# ------------------------------------------------------------
df = pd.DataFrame.from_dict(ddict);
dfi = df.set_index('index');
dfo = dfi.reindex(dfi.index|iout) # add new index values to the dataframe
dfo = dfo.interpolate(method='linear').loc[iout]

相关问题