附件是我正在处理的时间序列。如果我们看到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
1条答案
按热度按时间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: