如何使用 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-

更新于: 2023-07-31

2K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告