尝试根据 python 中的匹配时间戳来匹配行

Trying to match rows based on matching timestamps in python

所以我试图了解当时间戳的格式不同时如何根据匹配的时间戳来匹配两列的值。我相信这与将两列都放入同一个日期时间对象有关,但是其中一列在多个列中有时间戳组件,所以我在这里有点困惑。我在 python 工作。我会在这里进一步解释。

我有这个带时间戳的数据,我们将调用数据帧 A:

   timestamp     value_A
-------------------------
 5/3/16 8:00          64
 5/3/16 9:00          74
5/3/16 10:00          54
5/3/16 11:00          34
5/3/16 12:00          26
5/3/16 13:00          42
5/3/16 14:00          44
5/3/16 15:00          14
5/3/16 16:00          65
5/3/16 19:00          36
5/3/16 20:00          32
5/3/16 23:00          32
...

现在,这是带时间戳的数据帧 B:

Month   Day   Hour    value_B
------------------------------
    5     3      8         35
    5     3      9         44
    5     3     10         22
    5     3     11         25
    5     3     12         75 
    5     3     13         64
    5     3     14         43
    5     3     15         44
    5     3     16         26
    5     3     17         22 
    5     3     18         35 
    5     3     19         36 
    5     3     20         32
    5     3     21         26
    5     3     22         44 
    5     3     23         22 
...

构造函数:

df1 = pd.DataFrame({'timestamp': ['5/3/16 8:00', '5/3/16 9:00', '5/3/16 10:00', '5/3/16 11:00', 
                                  '5/3/16 12:00', '5/3/16 13:00', '5/3/16 14:00', '5/3/16 15:00', 
                                  '5/3/16 16:00', '5/3/16 19:00', '5/3/16 20:00', '5/3/16 23:00'], 
                    'value_A': [64, 74, 54, 34, 26, 42, 44, 14, 65, 36, 32, 32]})

df2 = pd.DataFrame({'Month': [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
                    'Day': [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
                    'Hour': [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
                    'value_B': [35, 44, 22, 25, 75, 64, 43, 44, 26, 22, 35, 36, 32, 26, 44, 22]})

现在,虽然这两个数据框看起来很相似,但它们仍然有很大不同,主要是因为数据框 A 在一列中有时间戳,而数据框 B 在三列中有时间和日期。另外,请注意数据帧 A 中有跳过的时间戳条目,因此数据帧 B 有更多行。我想要做的是按时间戳匹配行并创建一个包含 value_A 和 value_B 列的新数据框,忘记 dataframe_B 中的 value_B 行与数据帧 A 有相应的时间戳。所以这是我要生成数据帧 C 的数据帧:

   timestamp     value_A      value_B
--------------------------------------  
 5/3/16 8:00          64           35    
 5/3/16 9:00          74           44
5/3/16 10:00          54           22
5/3/16 11:00          34           25
5/3/16 12:00          26           75
5/3/16 13:00          42           64
5/3/16 14:00          44           43
5/3/16 15:00          14           44
5/3/16 16:00          65           26
5/3/16 19:00          36           36
5/3/16 20:00          32           32
5/3/16 23:00          32           22

我很困惑如何制定逻辑以便可以从我的月、日和小时列拼凑时间戳,以及如何指示我希望省略没有匹配时间戳的行。如何将这两个数据帧匹配到数据帧 C 中,以便匹配带时间戳的行?

您可以将“月”、“日”、“小时”列的值转换为列表列表,然后使用列表理解,将每个子列表格式化为正确的日期时间格式,并将最终的字符串列表分配给新 timestamp 列。然后将 timestamp 列都转换为日期时间(实际上本练习不需要此步骤,但我假设您稍后会需要它)。

最后从左侧合并 df1timestamp 上的 df2

df2['timestamp'] = ['{}/{}/16 {}:00'.format(*lst) for lst in df2.loc[:, 'Month':'Hour'].to_numpy().tolist()]
df2['timestamp'] = pd.to_datetime(df2['timestamp'])
df1['timestamp'] = pd.to_datetime(df1['timestamp'])
df3 = df1.merge(df2[['timestamp','value_B']], on='timestamp', how='left')

输出:

             timestamp  value_A  value_B
0  2016-05-03 08:00:00       64       35
1  2016-05-03 09:00:00       74       44
2  2016-05-03 10:00:00       54       22
3  2016-05-03 11:00:00       34       25
4  2016-05-03 12:00:00       26       75
5  2016-05-03 13:00:00       42       64
6  2016-05-03 14:00:00       44       43
7  2016-05-03 15:00:00       14       44
8  2016-05-03 16:00:00       65       26
9  2016-05-03 19:00:00       36       36
10 2016-05-03 20:00:00       32       32
11 2016-05-03 23:00:00       32       22