如何使用 Pandas 合并“不匹配”的时间序列数据?
时间序列数据是许多业务运营(尤其是金融和制造业)的关键组成部分。这些数据集通常存储在多个表或文件中,每个表包含数据的一个特定子集。合并这些表可能是一项具有挑战性的任务,尤其是在表包含不匹配的数据时。
在本文中,我们将学习如何使用 Pandas 合并不匹配的时间序列数据。Pandas 是 Python 中一个强大的数据分析库,提供了用于合并和操作数据的广泛工具。我们还将学习合并时间序列的不同技术,包括其语法和完整的示例。
方法
有多种方法可以使用 Pandas 合并不匹配的时间序列数据。在本文中,我们将了解一些常用的合并不匹配时间序列的方法。让我们详细讨论一下。
方法 1:使用内连接
使用 Python 中的 Pandas 合并不匹配时间序列数据的第一种方法是使用内连接。此连接仅返回两个 DataFrame 中具有匹配时间戳的行。这意味着任何在另一个 DataFrame 中没有对应匹配的行都将从合并后的 DataFrame 中排除。
语法
mergedData = pd.merge(dataframe1, dataframe2, on='timestamp', how='inner')
示例
在给定的示例中,我们首先使用 pd.DataFrame() 创建两个 DataFrame dataframe1 和 dataframe2。然后,我们使用 pd.merge() 对时间戳列执行内连接。生成的 DataFrame 仅包含两个 DataFrame 中具有匹配时间戳的行。
import pandas as pd # Creating DataFrame one dataframe1 = pd.DataFrame({'timestamp': ['2023-05-10 13:00:00', '2023-05-10 14:00:00', '2023-05-10 15:00:00', '2023-05-10 16:00:00'], 'stock': [25, 26, 28, 29]}) # Creating DataFrame two dataframe2 = pd.DataFrame({'timestamp': ['2023-05-10 14:00:00', '2023-05-10 15:00:00', '2023-05-10 16:00:00', '2023-05-10 17:00:00'], 'price': [40, 50, 60, 70]}) # Perform inner join operation to merge not matching time series mergedData = pd.merge(dataframe1, dataframe2, on='timestamp', how='inner') print(mergedData)
输出
timestamp stock price 0 2023-05-10 14:00:00 26 40 1 2023-05-10 15:00:00 28 50 2 2023-05-10 16:00:00 29 60
方法 2:使用外连接
使用 Python 中的 Pandas 合并不匹配时间序列数据的第二种方法是使用外连接。此连接返回两个 DataFrame 中的所有行,无论另一个 DataFrame 中是否存在匹配的时间戳。如果某行在另一个 DataFrame 中没有对应匹配,Pandas 将使用 NaN(非数字)填充缺失值。
语法
mergedData = pd.merge(dataframe1, dataframe2, on='timestamp', how='outer)
示例
在给定的示例中,我们首先使用 pd.DataFrame() 创建两个 DataFrame dataframe1 和 dataframe2。然后,我们使用 pd.merge() 对时间戳列执行外连接。生成的 DataFrame 包含来自两个 DataFrame 的所有行,在没有匹配的地方使用缺失值 (NaN)。
import pandas as pd # Creating DataFrame one dataframe1 = pd.DataFrame({'timestamp': ['2023-05-10 13:00:00', '2023-05-10 14:00:00', '2023-05-10 15:00:00', '2023-05-10 16:00:00'], 'stock': [25, 26, 28, 29]}) # Creating DataFrame two dataframe2 = pd.DataFrame({'timestamp': ['2023-05-10 14:00:00', '2023-05-10 15:00:00', '2023-05-10 16:00:00', '2023-05-10 17:00:00'], 'price': [30, 40, 50, 60]}) # Perform left join operation to merge not matching time series mergedData = pd.merge(dataframe1, dataframe2, on='timestamp', how='outer') print(mergedData)
输出
timestamp stock price 0 2023-05-10 13:00:00 25.0 NaN 1 2023-05-10 14:00:00 26.0 30.0 2 2023-05-10 15:00:00 28.0 40.0 3 2023-05-10 16:00:00 29.0 50.0 4 2023-05-10 17:00:00 NaN 60.0
方法 3:使用左连接
使用 Python 中的 Pandas 合并不匹配时间序列数据的第三种方法是使用左连接。此连接返回左侧 DataFrame 的所有行以及右侧 DataFrame 中的匹配行。如果某行在右侧 DataFrame 中没有对应匹配,Pandas 将使用 NaN 填充缺失值。
语法
mergedData = pd.merge(dataframe1, dataframe2, on='timestamp', how='left')
示例
在下面的示例中,我们首先使用 pd.DataFrame() 创建两个 DataFrame dataframe1 和 dataframe2。然后,我们使用 pd.merge() 对时间戳列执行左连接。生成的 DataFrame 包含 dataframe1 的所有行以及 dataframe2 的匹配行,在没有匹配的地方使用缺失值 (NaN)。
import pandas as pd # Creating DataFrame one dataframe1 = pd.DataFrame({'timestamp': ['2023-05-10 13:00:00', '2023-05-10 14:00:00', '2023-05-10 15:00:00', '2023-05-10 16:00:00'], 'stock': [25, 26, 28, 29]}) # Creating DataFrame two dataframe2 = pd.DataFrame({'timestamp': ['2023-05-10 14:00:00', '2023-05-10 15:00:00', '2023-05-10 16:00:00', '2023-05-10 17:00:00'], 'price': [30, 40, 50, 60]}) # Perform left join operation to merge not matching time series mergedData = pd.merge(dataframe1, dataframe2, on='timestamp', how='left') print(mergedData)
输出
timestamp stock price 0 2023-05-10 13:00:00 25 NaN 1 2023-05-10 14:00:00 26 30.0 2 2023-05-10 15:00:00 28 40.0 3 2023-05-10 16:00:00 29 50.0
方法 4:使用 merge_asof() 函数
使用 Python 中的 Pandas 合并不匹配时间序列数据的最后一种方法是使用 merge_asof() 函数。Pandas 中的此函数也用于合并两个时间序列 DataFrame,其中我们希望将右侧 DataFrame 的值与左侧 DataFrame 中最近的先前值匹配。
语法
mergedData = pd.merge_asof(df, dataframe1, on='time', direction='backward')
示例
在下面的示例中,我们首先使用 pd.DataFrame() 创建两个 DataFrame df 和 dataframe1。然后,我们使用 pd.to_datetime() 将两个 DataFrame 中的 time 列转换为日期时间格式。最后,我们使用 pd.merge_asof() 合并两个 DataFrame,并将 direction 参数指定为 'backward' 以指示我们希望将右侧 DataFrame 的值与左侧 DataFrame 中最近的先前值匹配。
import pandas as pd # Creating DataFrame 1: Course price data df = pd.DataFrame({'time': pd.date_range('2023-05-10', periods=10, freq='1h'), 'price': [100, 102, 105, 104, 107, 109, 111, 110, 112, 115]}) # Creating DataFrame 2: Course Launch events data dataframe1 = pd.DataFrame({'time': ['2023-05-10 03:00:00', '2023-05-10 07:30:00', '2023-05-10 09:45:00', '2023-05-10 12:15:00'], 'news': ['Newly added', 'Most demanded course', 'Best Seller', 'Developers choice']}) # Converting the 'time' column in both dataframes to datetime format df['time'] = pd.to_datetime(df['time']) dataframe1['time'] = pd.to_datetime(dataframe1['time']) # Merging both the dataframes using merge_asof() function using backward approach mergedData = pd.merge_asof(df, dataframe1, on='time', direction='backward') print(mergedData)
输出
time price news 0 2023-05-10 00:00:00 100 NaN 1 2023-05-10 01:00:00 102 NaN 2 2023-05-10 02:00:00 105 NaN 3 2023-05-10 03:00:00 104 Newly added 4 2023-05-10 04:00:00 107 Newly added 5 2023-05-10 05:00:00 109 Newly added 6 2023-05-10 06:00:00 111 Newly added 7 2023-05-10 07:00:00 110 Newly added 8 2023-05-10 08:00:00 112 Most demanded course 9 2023-05-