Pandas - 在索引中使用merge_asof函数

时间:2017-05-15 11:59:10

标签: python pandas

代码是:

select id,
       max(case when fieldid = 2 then data end) as field2,
       max(case when fieldid = 4 then data end) as field4
from t
group by id;

import numpy as np import pandas as pd dateparse = lambda x: pd.datetime.strptime(x,'%d %m %Y %H %M') vento = pd.read_csv('dados_tpm.txt', header=0, delim_whitespace= True, parse_dates = [['Dia', 'Mes', 'Ano', 'Hora','Minuto']], index_col = False, date_parser = dateparse) vento1 = vento.rename(columns={'Dia_Mes_Ano_Hora_Minuto': 'Data'}) vento0 = vento1.set_index('Data') vento_time = pd.DataFrame({'Data':pd.date_range(start='2016-07-12 18:00:00',end='2017-02-28 21:00:00',freq='3H')}) vento_time0 = vento_time.set_index('Data') vento_2 = pd.merge_asof(vento_time0,vento0, on='Index', tolerance=pd.Timedelta("5 minutes")).fillna('NAN') 类似于:

vento0

Index Vel Dir 2016-07-12 16:17:00 9.8 13.8 2016-07-12 16:18:00 10.9 1.8 2016-07-12 16:19:00 10.0 11.1 2016-07-12 16:20:00 11.0 11.0 ... ... ... ... ... ... 2017-02-28 22:34:00 9.2 13.7 似乎是:

vento_time0

我的数据有一分钟的间隔,并且它没有正则化。这样做的目的是将其置于3小时间隔内,用五分钟范围内的最近数据替换缺失值。但是,当使用Index 2016-07-12 18:00:00 2016-07-12 21:00:00 2016-07-13 00:00:00 2016-07-13 03:00:00 ... ... ... ... 2017-02-28 21:00:00 时,会出现此错误:merge_asof。我还尝试使用KeyError: 'Index',索引的实际名称,但得到相同的错误。预期的输出将是:

Data

有人可以帮忙吗?有没有办法在索引中使用merge_asof函数?

3 个答案:

答案 0 :(得分:5)

做这样的事情: 使用.sort_values(by = 'Data')代替.set_index

vento0 = vento1.sort_values(by = 'Data')
vento_time0 = vento_time.sort_values(by = 'Data')

完成后,这应该有效:

vento_2 = pd.merge_asof(vento_time0,vento0, \
                        tolerance=pd.Timedelta("5 minutes")).fillna('NAN')

确保您的'NAN'成为"而不是数字"使用:

vento_2.convert_objects(convert_numeric=True)

使用merge_asof并转换'NAN'后,您可以设置索引。

vento_2.set_index(['Data'], inplace=True)

答案 1 :(得分:1)

我想你想要一种不同形式的asof()

vento0.asof(vento_time0.index)

答案 2 :(得分:1)

如果您尝试merge_asof()指标,则需要使用以下内容:

vento_2 = pd.merge_asof(vento_time0,vento0, left_index = True, right_index = True, tolerance=pd.Timedelta("5 minutes")).fillna('NAN')

文档:http://pandas.pydata.org/pandas-docs/version/0.20/generated/pandas.merge_asof.html