如何使用 Pandas 合并"不匹配"的时间序列?
时间序列数据是许多业务运营的关键部分,尤其是金融和制造业。这些数据集通常包含多个表或文件,每个表包含特定的数据子集。合并这些表可能是一项具有挑战性的任务,主要是当表包含不匹配的数据时。
在本文中,我们将学习如何使用 Pandas 合并不匹配的时间序列数据。Pandas 是 Python 中一个强大的数据分析库,它提供了用于合并和操作数据的大量工具。我们还将学习合并时间序列的不同技术及其语法和完整示例。
方法
有许多方法可用于使用 Pandas 合并不一致的时间序列数据。在本文中,我们将看到一些合并不匹配的时间序列的常用方法。现在让我们详细讨论它们。
方法 1:使用内连接
在 Python 中使用 pandas 合并不匹配的时间序列数据的第一种方法是使用内连接。此连接仅返回两个 DataFrame 中具有匹配时间戳的行。这意味着,任何在另一个 DataFrame 中没有相应匹配的行都将从合并的 DataFrame 中排除。
语法
mergedData = pd.merge(dataframe1, dataframe2, on='timestamp', how='inner')
示例
在给定的示例中,我们首先使用 pd.DataFrame() 创建两个 DataFrames dataframe1 和 dataframe2。然后我们使用 pd.merge() 对时间戳列执行内连接。生成的 DataFrame 仅包含两个 DataFrame 中时间戳匹配的行。
import pandas as pd # 创建 DataFrame 一 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]}) # 创建 DataFrame 二 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]}) # 执行内连接操作以合并不匹配的时间序列 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() 创建两个 DataFrames dataframe1 和 dataframe2。然后我们使用 pd.merge() 对时间戳列执行外连接。生成的 DataFrame 包含两个 DataFrame 中的所有行,在没有匹配的地方有缺失值 (NaN)。
import pandas as pd # 创建 DataFrame 一 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]}) # 创建 DataFrame 二 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]}) # 执行左连接操作以合并不匹配的时间序列 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() 创建两个 DataFrames dataframe1 和 dataframe2。然后我们使用 pd.merge() 对时间戳列执行左连接。生成的 DataFrame 包含 dataframe1 中的所有行和 dataframe2 中的匹配行,在没有匹配的地方有缺失值 (NaN)。
import pandas as pd # 创建 DataFrame 一 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]}) # 创建 DataFrame 二 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]}) # 执行左连接操作以合并不匹配的时间序列 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 中的此函数还用于合并两个时间序列数据框,我们希望将右侧数据框的值与左侧数据框中最近的先前值进行匹配。
语法
mergedData = pd.merge_asof(df, dataframe1, on='time', direction='backward')
示例
在下面的示例中,我们首先使用 pd.DataFrame() 创建两个数据框 df 和 dataframe1。然后我们使用 pd.to_datetime() 将两个数据框中的时间列转换为日期时间格式。最后,我们使用 pd.merge_asof() 合并两个数据框,并将方向参数指定为"backward",以表明我们希望将右侧数据框值与左侧数据框中最近的先前值进行匹配。
import pandas as pd # 创建数据框 1:课程价格数据 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]}) # 创建数据框 2:课程启动事件数据 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']}) ) # 将两个数据框中的"时间"列转换为日期时间格式 df['time'] = pd.to_datetime(df['time']) dataframe1['time'] = pd.to_datetime(dataframe1['time']) # 使用 merge_asof() 函数使用后向方法合并两个数据框 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-