如何用Pandas合并 “不匹配的 “时间序列
在这篇文章中,我们将看到如何用Pandas合并 “不匹配 “的时间序列。
时间序列是以固定的时间间隔记录的观察序列。时间序列分析对于观察特定资产、证券或经济变量如何随时间变化很有用
通常情况下,数据由数值的微小差异组成,很可能是天气测量或金融测量,当结合这些时间序列数据框架时,就会出现合并的问题。这有助于合并不匹配的时间序列数据
用Pandas合并 “不匹配的 “时间序列
假设我们有两个时间序列数据框架df(left)和df1(right)。当我们合并这两个数据框架时,如果右边数据框架的值不在左边数据框架的值中,那么就会出现问题。所以在这种情况下,我们使用pandas中的merge_asof。它检查右数据框df1中最接近的前一个值,并将其替换为该值
语法:
pandas.merge_asof(left, right, on=None, left_on=None, right_on=None, left_index=False, right_index=False, by=None, left_by=None, right_by=None, suffixes=('_x', '_y'), tolerance=None, allow_exact_matches=True, direction='backward')
# importing packages
import pandas as pd
# creating dataframe df(left)
df = pd.DataFrame()
df['time'] = pd.date_range('08/12/2021',
periods=6, freq='4S')
df['data_name'] = ["Geeks", "Geeks", "Geeks",
"Geeks", "GeeksforGeeks",
"GeeksforGeeks"]
df['values'] = [1, 2, 3, 4, 5, 6]
# creating datafrframe df1(right)
df1 = pd.DataFrame()
df1['time'] = pd.date_range('08/12/2021',
periods=6,
freq='6S')
df1['data_name'] = ["Geeks", "Geeks", "Geeks",
"Geeks", "GeeksforGeeks",
"GeeksforGeeks"]
df1['values'] = [7, 8, 9, 10, 11, 12]
# using merge_asof for merging left and right
df2 = pd.merge_asof(df, df1, on='time', by='data_name',
tolerance=pd.Timedelta('2s'))
# view data
print(df)
print(df1)
print(df2)
输出:
我们通过 “data_name “列在 “time “上合并这些数据框架(df和df1),但有些时间值不匹配。例如,在第二行中,A的时间比B的时间晚两秒。
另一个问题是 values_y 是如何生成的
在第一行中,时间在两个数据帧df和df1中都是匹配的,所以数值是相同的,在第二行中,df有4s,而df1有6s,两者不相等,所以这个merge_asof在右边的数据帧df1中寻找之前最接近的数值,所以这里0s是最接近的,但是为什么数值是NaN,因为我们提到的容忍时间框架是2s,但它是6s,所以00:00:004的数值_y是NaN。
Merge_asof 也提供了一个选项来排除精确匹配(attr=allow_exact_matches)。
1.如果是 “真”,允许用相同的 “on “值进行匹配(即小于或等于/大于或等于)。
2.如果是假的,就不要匹配相同的’on’值(即严格小于/严格大于)。
# importing packages
import pandas as pd
# creating dataframe
df = pd.DataFrame()
df['time'] = pd.date_range('08/12/2021',
periods=6,
freq='4S')
df['data_name'] = ["Geeks", "Geeks", "Geeks",
"Geeks", "GeeksforGeeks",
"GeeksforGeeks"]
df['values'] = [1, 2, 3, 4, 5, 6]
# creating dataframe
df1 = pd.DataFrame()
df1['time'] = pd.date_range('08/12/2021',
periods=6, freq='6S')
df1['data_name'] = ["Geeks", "Geeks", "Geeks",
"Geeks", "GeeksforGeeks",
"GeeksforGeeks"]
df1['values'] = [7, 8, 9, 10, 11, 12]
# allow_exact_matches=True for merging
df3 = pd.merge_asof(df, df1, on='time',
by='data_name',
allow_exact_matches=True)
# view data
print(df3)
# allow_exact_matches=False for merging df and df1
df4 = pd.merge_asof(df, df1, on='time',
by='data_name',
allow_exact_matches=False)
# view data
print(df4)
输出:
极客教程