我正在尝试与Pandas ffill
制作一些常规时间序列,但我收到的是非唯一索引错误。
这是我的代码:
for d in data_types:
series = df[df['datatype'] == d]['measurementvalue'].values
times = df[df['datatype'] == d]['displaydate'].values
data_series = pd.Series(series, index = times)
data_series.drop_duplicates(inplace = True)
data_series.asfreq('30Min', method = 'ffill')
all_series.append(data_series)
由于对asfreq
data_type
的{{1}}调用,我收到以下错误:
ValueError: cannot reindex a non-unique index with a method or limit
这是针对一组数据,其中drop_duplicates
导致长度从2119下降到1299,这表明它是最密集的(时间明智的)值。
==========
我做了一些探索,并通过将时间滞后到指数中最接近的秒来缩小问题,我可以看到当两行落入同一秒时创建的“重复”索引。我的猜测是这些是令人讨厌的行......
2016-03-02 04:03:29.693 8.250347
2016-03-02 04:03:29.693 7.478983
2016-03-06 00:19:30.183 45.97248
2016-03-06 00:19:30.183 24.06088
2016-03-14 02:44:58.783 9.169300
2016-03-14 02:44:58.783 4.221998
2016-03-18 21:54:20.097 73.80586
2016-03-24 16:41:19.825 3.608202
2016-03-24 16:41:19.825 3.887996
2016-03-25 03:35:57.197 4.974968
2016-03-25 03:35:57.197 5.638140
2016-04-02 11:18:27.290 7.923712
2016-04-02 11:18:27.290 6.143240
2016-04-10 19:59:54.677 3.143636
2016-04-10 19:59:54.686 14.222390
降低价值的最佳方式是什么?假设我想编写一个自定义方法,它向我发送给定索引值的所有重复值,并发回应该用于该索引值的单个值。我怎么能这样做?
答案 0 :(得分:0)
尝试这样的事情,但既然你没有包含任何数据,这只是一个启动者。
for d in data_types:
rawDf = df[df['datatype'] == d]
data_series = rawDf[['measurementvalue','displaydate']]
data_series.set_index('displaydate',drop=False, inplace = True)
data_series.drop_duplicates(inplace = True)
data_series.asfreq('30Min', method = 'ffill')
all_series.append(data_series)
答案 1 :(得分:0)
如果您想保持每个日期时间的最大值。首先使date_time成为一列并使用
df.groupby('date_time').max()
如果您想始终保留第一个或最后一个条目look at this answer: