如何使用 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-
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP