![](/img/trans.png)
[英]Compare timestamps in two different DataFrames with different length and then merge them
[英]Compare and match range of timestamps in pandas two different dataframes
如何比較和匹配兩個不同數據幀中兩個時間戳范圍的開始和結束,當時間戳的頻率變化時,不知道哪個范圍開始得早,結束得晚。 然后丟棄不匹配的開始和結束,所以兩個范圍是相同的。 很容易在 txt 文件中手動完成,如何在 python 和 pandas 數據幀中完成?
樣本先 dataframe:
0 1
0 2022-10-30 14:11:57
1 2022-10-30 14:11:57
2 2022-10-30 14:11:57
3 2022-10-30 14:11:58
4 2022-10-30 14:11:59
... ...
149801 2022-10-30 15:22:11
149802 2022-10-30 15:22:11
149803 2022-10-30 15:22:11
149804 2022-10-30 15:22:11
149805 2022-10-30 15:22:11
\[149806 rows x 2 columns\]
樣本二 dataframe:
0 1
0 2022-10-30 14:11:59
1 2022-10-30 14:11:59
2 2022-10-30 14:12:00
3 2022-10-30 14:12:00
4 2022-10-30 14:12:00
... ...
21065 2022-10-30 15:22:11
21066 2022-10-30 15:22:11
21067 2022-10-30 15:22:12
21068 2022-10-30 15:22:13
21069 2022-10-30 15:22:13
第 1 列填充數據
比較特定行中的兩個時間戳如下所示:
if first_df[0].iloc[0] == second_df[0].iloc[0]:
print('hit')
else:
print('miss')
如何在整個范圍內做到這一點,以便可以在保留內部內容的同時丟棄不匹配的開始和結束?
這兩個范圍的樣本匹配:第一個 dataframe:
0 1
4 2022-10-30 14:11:59
... ...
149801 2022-10-30 15:22:11
149802 2022-10-30 15:22:11
149803 2022-10-30 15:22:11
149804 2022-10-30 15:22:11
149805 2022-10-30 15:22:11
第二個 dataframe:
0 1
0 2022-10-30 14:11:59
1 2022-10-30 14:11:59
2 2022-10-30 14:12:00
3 2022-10-30 14:12:00
4 2022-10-30 14:12:00
... ...
21065 2022-10-30 15:22:11
21066 2022-10-30 15:22:11
編輯:
考慮這段代碼(注意每個 dataframe 中時間戳的頻率是不同的):
import pandas as pd
from datetime import datetime
df1 = pd.DataFrame({'val_1' : [10,11,12,13,14,15]},
index = [pd.DatetimeIndex([datetime.strptime(s, '%Y-%m-%d %H:%M:%S')])[0]
for s in ['2022-11-12 09:03:59',
'2022-11-12 09:03:59',
'2022-11-12 09:03:59',
'2022-11-12 09:04:00',
'2022-11-12 09:04:01',
'2022-11-12 09:04:02'
] ])
df2 = pd.DataFrame({'val_2': [11,22,33,44]},
index = [pd.DatetimeIndex([datetime.strptime(s, '%Y-%m-%d %H:%M:%S')])[0]
for s in ['2022-11-12 09:03:58',
'2022-11-12 09:03:59',
'2022-11-12 09:03:59',
'2022-11-12 09:04:00',
] ])
我想要的結果是:
val_1 val_2
2022-11-12 09:03:59 10 NaN
2022-11-12 09:03:59 11 22
2022-11-12 09:03:59 12 33
2022-11-12 09:04:00 13 44
或:df1:
2022-11-12 09:03:59 10
2022-11-12 09:03:59 11
2022-11-12 09:03:59 12
2022-11-12 09:04:00 13
和 df2:
2022-11-12 09:03:59 22
2022-11-12 09:03:59 33
2022-11-12 09:04:00 44
嘗試使用可能的每個選項組合加入和合並,但無法做到這一點。
新示例數據的新答案:
此處合並的問題是您有重復的索引日期,因此無法完成明確的分配。
但是您可以按照開始時的建議單獨進行。 你說你不知道兩個 df 中哪個開始得早或結束得晚。 找到兩個索引的最小值並獲得這兩個的最大值。 上限相同,獲取兩個最大值並取這兩個值的最小值。 然后你用下限和上限分割你的 df。
lower, upper = max(df1.index.min(), df2.index.min()), min(df1.index.max(), df2.index.max())
df1 = df1.loc[lower:upper]
print(df1)
val_1
2022-11-12 09:03:59 10
2022-11-12 09:03:59 11
2022-11-12 09:03:59 12
2022-11-12 09:04:00 13
df2 = df2.loc[lower:upper]
print(df2)
val_2
2022-11-12 09:03:59 22
2022-11-12 09:03:59 33
2022-11-12 09:04:00 44
舊的:
由於您沒有提供可用數據,這里是我自己的示例輸入數據:
np.random.seed(42)
df1 = pd.DataFrame(
{
'A' : np.random.randint(0,10, size=10)
},
index= pd.date_range('2022-11-26 08:00', periods=10, freq='10T')
)
df2 = pd.DataFrame(
{
'B' : np.random.randint(0,10, size=10)
},
index= pd.date_range('2022-11-26 08:30', periods=10, freq='10T')
)
創建此數據:
#df1
A
2022-11-26 08:00:00 6
2022-11-26 08:10:00 3
2022-11-26 08:20:00 7
2022-11-26 08:30:00 4
2022-11-26 08:40:00 6
2022-11-26 08:50:00 9
2022-11-26 09:00:00 2
2022-11-26 09:10:00 6
2022-11-26 09:20:00 7
2022-11-26 09:30:00 4
#df2
B
2022-11-26 08:30:00 3
2022-11-26 08:40:00 7
2022-11-26 08:50:00 7
2022-11-26 09:00:00 2
2022-11-26 09:10:00 5
2022-11-26 09:20:00 4
2022-11-26 09:30:00 1
2022-11-26 09:40:00 7
2022-11-26 09:50:00 5
2022-11-26 10:00:00 1
我認為一個不錯的方法仍然是合並數據以找出關閉的邊緣。 只是一個報價,如果您將它們合並,您可以像這樣直接比較它們:
combined = df1.merge(df2, how='inner', left_index=True, right_index=True)
combined['compare'] = np.where(combined['A']==combined['B'], 'hit', 'miss')
print(combined)
Output combined
:
A B compare
2022-11-26 08:30:00 4 3 miss
2022-11-26 08:40:00 6 7 miss
2022-11-26 08:50:00 9 7 miss
2022-11-26 09:00:00 2 2 hit
2022-11-26 09:10:00 6 5 miss
2022-11-26 09:20:00 7 4 miss
2022-11-26 09:30:00 4 1 miss
如果你真的需要他們分開,只需添加:
df1_new = combined[['A']]
df2_new = combined[['B']]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.