簡體   English   中英

Pandas - 在索引中使用merge_asof函數

[英]Pandas - Using merge_asof function in index

代碼是:

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似乎是:

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

我的數據有一分鍾的間隔,並且它沒有正則化。 這樣做的目的是將其置於3小時間隔內,用五分鍾范圍內的最近數據替換缺失值。 但是當使用merge_asof時,會出現此錯誤: KeyError: 'Index' 我也嘗試使用Data ,索引的實際名稱,但得到相同的錯誤。 預期的產出將是:

Index                 Vel  Dir
2016-07-12 18:00:00   8.0  55
2016-07-12 21:00:00   16.0 67
2016-07-13 00:00:00   NAN  NAN
2016-07-13 03:00:00   19.0 83
...        ...
...        ...
2017-02-28 21:00:00   NAN  NAN

有人可以幫忙嗎? 有沒有辦法在索引中使用merge_asof函數?

做這樣的事情:使用.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)

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

vento0.asof(vento_time0.index)

如果您在merge_asof()上嘗試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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM