python在时间序列中插入缺失的条目

qaxu7uf2  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(255)

附件是我正在处理的时间序列。如果我们看到df,每个名字的时间戳是不同的。而且,有些地方缺少时间戳和值。我试图得到一个时间序列,其中序列是从时间序列的最小元素Map到时间序列的最大元素。此外,如果插值/外推,则缺少值。

import io
import pandas as pd

data = io.StringIO('''\
Values
1992-08-27 07:30:00,28.0,27.0  
1992-08-27 08:00:00,28.2,27.0    
1992-08-27 09:00:00,28.8,27.5  
1992-08-27 09:30:00,29.0  
1992-08-27 10:30:00,29.6,26.0  
1992-08-27 11:00:00,29.8,27.0  
1992-08-27 11:30:00,30.0,27.0
''')
s = pd.read_csv(data, squeeze=True)
s = pd.DataFrame(s)
s = s.reset_index()
s.columns = ['datetime', 'value1', 'value2']
s['name'] = 'A'

df =s.copy()

data = io.StringIO('''\
Values
1992-08-27 08:00:00,29.2,29.0     
1992-08-27 09:30:00,30.0,37.0  
1992-08-27 10:30:00,24.6,37.0  
1992-08-27 11:00:00,24.8,37.0  
''')
s = pd.read_csv(data, squeeze=True)
s = pd.DataFrame(s)
s = s.reset_index()
s.columns = ['datetime', 'value1', 'value2']
s['name'] = 'B'

df = df.append(s, sort=False)

尝试/失败:

df['datetime'] = pd.to_datetime(df['datetime'])
df.set_index('datetime', inplace=True)
df.resample('M').interpolate()
ValueError: cannot reindex from a duplicate axis

预计df:可能到这里吗?

datetime  value1  value2 name
1992-08-27 07:30:00    28.0    27.0    A
1992-08-27 08:00:00    28.2    27.0    A
1992-08-27 08:30:00    28.5    27.25    A
1992-08-27 09:00:00    28.8    27.5    A
1992-08-27 09:30:00    29.0    27.0    A
1992-08-27 10:00:00    29.6    26.5    A
1992-08-27 10:30:00    29.6    27.0    A
1992-08-27 11:00:00    29.8    27.0    A
1992-08-27 11:30:00    30.0    27.0    A
1992-08-27 07:30:00    29.2    29.0    B
1992-08-27 08:00:00    29.2    29.0    B
1992-08-27 08:30:00    29.2    29.0    B
1992-08-27 09:00:00    29.2    29.0    B
1992-08-27 09:30:00    30.0    37.0    B
1992-08-27 10:30:00    24.6    37.0    B
1992-08-27 11:00:00    24.8    37.0    B
1992-08-27 11:30:00    24.8    37.0    B
eulz3vhy

eulz3vhy1#

这里的问题确实是处理重复索引:例如,a和bDataframe共享相同的第二个索引(1992-08-27 08:00:00)。
为了解决这个问题,我建议在应用重采样和插值之前按名称分组。
你可以尝试以下方法: df.groupby('name').resample('30T').asfreq().interpolate(method='linear', limit_area="inside") 编辑:由于多索引,上面的一行只允许您使用线性方法。为了解锁其他方法,需要按名称删除第二个索引(由groupby创建)。
例如 df2=df.groupby('name').resample('30T').asfreq().reset_index(level=0, drop=True).interpolate(method='values') 返回以下Dataframe:

value1  value2 name datetime                                
1992-08-27 07:30:00    28.0   27.00    A
1992-08-27 08:00:00    28.2   27.00    A
1992-08-27 08:30:00    28.5   27.25  NaN
1992-08-27 09:00:00    28.8   27.50    A
1992-08-27 09:30:00    29.0   27.00    A
1992-08-27 10:00:00    29.3   26.50  NaN
1992-08-27 10:30:00    29.6   26.00    A
1992-08-27 11:00:00    29.8   27.00    A
1992-08-27 11:30:00    30.0   27.00    A
1992-08-27 08:00:00    29.2   29.00    B
1992-08-27 08:30:00    28.5   27.25  NaN
1992-08-27 09:00:00    28.8   27.50  NaN
1992-08-27 09:30:00    30.0   37.00    B
1992-08-27 10:00:00    29.3   26.50  NaN
1992-08-27 10:30:00    24.6   37.00    B
1992-08-27 11:00:00    24.8   37.00    B

相关问题