Pandas 如何合并“不匹配”的时间序列
时间序列数据是许多业务操作的重要部分,尤其是金融和制造业。这些数据集通常以多个表格或文件的形式存在,每个表格都包含特定的数据子集。合并这些表格可能是一项具有挑战性的任务,特别是当表格中的数据不匹配时。
在本文中,我们将学习如何使用Pandas合并不匹配的时间序列数据。Pandas是Python中功能强大的数据分析库,提供了丰富的工具来合并和操作数据。我们还将学习不同的合并时间序列的技术,包括它们的语法和完整示例。
方法
有许多方法可以使用Pandas合并不匹配的时间序列数据。在本文中,我们将介绍一些常见的合并不匹配时间序列的方法。现在让我们详细讨论它们。
方法1:使用内连接
合并不匹配时间序列数据的第一种方法是使用Pandas中的内连接。这种连接只返回在两个数据帧中具有匹配时间戳的行。这意味着任何在另一个数据帧中没有相应匹配的行将被排除在合并的数据帧之外。
语法
mergedData = pd.merge(dataframe1, dataframe2, on='timestamp', how='inner')
示例
在给定的例子中,我们首先使用pd.DataFrame()创建两个DataFrames dataframe1和dataframe2。然后我们使用pd.merge()在timestamp列上进行内连接。结果DataFrame只包含在两个DataFrames中具有匹配的时间戳的行。
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:使用左连接
使用pandas在Python中合并不匹配的时间序列数据的第三种方法是使用左连接。这种连接返回左侧数据帧中的所有行和右侧数据帧中的匹配行。如果某一行在右侧数据帧中没有对应的匹配,则pandas将使用NaN填充缺失值。
语法
mergedData = pd.merge(dataframe1, dataframe2, on='timestamp', how='left')
示例
在下面的示例中,我们首先使用pd.DataFrame()创建两个DataFrame dataframe1和dataframe2。然后我们使用pd.merge()对timestamp列执行左连接。结果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中,这个函数也用于合并两个时间序列的数据帧,在这个过程中,我们希望将右边数据帧的值与左边数据帧中最近的先前值进行匹配。
语法
mergedData = pd.merge_asof(df, dataframe1, on='time', direction='backward')
示例
在下面的示例中,我们首先使用pd.DataFrame()创建两个数据帧df和dataframe1。然后,我们使用pd.to_datetime()将两个数据帧中的时间列转换为datetime格式。最后,我们使用pd.merge_asof()将两个数据帧合并,并将direction参数设置为’backward’,以指示我们希望将右侧数据帧的值与左侧数据帧中最近的前一个值进行匹配。
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-