如何使用 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+ 閱讀量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.