用Python中的过滤条件合并dataframes中的日期列

2024-05-14 21:55:01 发布

您现在位置:Python中文网/ 问答频道 /正文

有个棘手的问题。我得到了两个包含日期时间数据的熊猫数据帧,第一个:

Date                   Number
2018-02-28 23:59:00     20
2018-03-01 00:37:00     35
2018-03-01 00:58:00     46
2018-03-01 02:14:00     11
2018-03-01 02:32:00     15

第二个:

Date                   Value
2018-02-28 23:50:00     20
2018-02-28 23:51:00     35
2018-02-28 23:52:00     46
2018-02-28 23:53:00     11
2018-02-28 23:54:00     15
2018-02-28 23:55:00     20
2018-02-28 23:56:00     35
2018-02-28 23:57:00     46
2018-02-28 23:58:00     11
2018-02-28 23:59:00     15
2018-03-01 00:00:00     15

正如您已经注意到的,第一个数据帧中的日期只是随机日期,而在第二个数据帧中,它们按每行+1分钟的递增顺序存储。你知道吗

我试图实现的是将第一个数据帧连接到第二个on date列,但不像内部连接样式那样一对一,而是使用如下规则:从第一个数据帧获取日期(例如,“2018-02-28 23:59:00”并从第二个数据帧连接21行-距离日期10分钟,距离日期10分钟(例如,将从“2018-02-28 23:49:00”到“2018-03-01 00:09:00”)。你知道吗

我有点困惑,有没有什么过滤功能可以帮助实现这种合并?或者可能有一些纯粹的脓液。你知道吗

预期结果如下:

Date1                      Date2                      Value
2018-02-28 23:59:00        2018-02-28 23:49:00        20                      
2018-02-28 23:59:00        2018-02-28 23:50:00        35               
2018-02-28 23:59:00        2018-02-28 23:51:00        46
2018-02-28 23:59:00        2018-02-28 23:52:00        15
2018-02-28 23:59:00        2018-02-28 23:53:00        20
2018-02-28 23:59:00        2018-02-28 23:54:00        35
2018-02-28 23:59:00        2018-02-28 23:55:00        46
2018-02-28 23:59:00        2018-02-28 23:56:00        11
2018-02-28 23:59:00        2018-02-28 23:57:00        15
2018-02-28 23:59:00        2018-02-28 23:58:00        20
2018-02-28 23:59:00        2018-02-28 23:59:00        35
2018-02-28 23:59:00        2018-03-01 00:00:00        46
2018-02-28 23:59:00        2018-03-01 00:01:00        11
2018-02-28 23:59:00        2018-03-01 00:02:00        15
2018-02-28 23:59:00        2018-03-01 00:03:00        20
2018-02-28 23:59:00        2018-03-01 00:04:00        35
2018-02-28 23:59:00        2018-03-01 00:05:00        46
2018-02-28 23:59:00        2018-03-01 00:06:00        11
2018-02-28 23:59:00        2018-03-01 00:07:00        15
2018-02-28 23:59:00        2018-03-01 00:08:00        20  
2018-02-28 23:59:00        2018-03-01 00:09:00        46 

谢谢。你知道吗


Tags: 数据功能距离numberdatevalueon规则
1条回答
网友
1楼 · 发布于 2024-05-14 21:55:01

所以,输入如下:

import pandas as pd
df1 = pd.DataFrame({'Date1':[pd.datetime(2018,02,28, 23,59,00),pd.datetime(2018,03,01, 00,37,00)], 
                    'Number': [20,35]})
df2 = pd.DataFrame({'Date2':[pd.datetime(2018,02,28,23,50,00), pd.datetime(2018,02,28,23,51,00),pd.datetime(2018,03,01,00,42,00)], 
                    'Value':[20, 35, 46]})

首先,您可以在df1中创建一个列l_d2,其中包含从df1Date1的+/-10分钟内的所有Date2的列表,例如(下面是您真正需要的过滤函数):

from datetime import timedelta
df1['l_d2'] = df1['Date1'].apply(lambda x: list(df2['Date2'][((x- timedelta(minutes=10)) <= df2['Date2']) & (df2['Date2'] <= (x + timedelta(minutes=10)))]))

然后在这个新列上创建一个带有stack函数的序列,如下所示:

s1 = df1.apply(lambda x: pd.Series(x['l_d2']),axis=1).stack().reset_index(level=1, drop=True)
s1.name = 'Date2' #same name as in df2 for merging after

最后,您可以通过将s1df1连接,删除列l_d2(不再有用)并与df2合并来添加列Value来创建欲望输出df_output

df_output = df1.drop('l_d2', axis=1).join(s1).merge(df2, on ='Date2')

我输入的结果如下:

                Date1  Number               Date2  Value
0 2018-02-28 23:59:00      20 2018-02-28 23:50:00     20
1 2018-02-28 23:59:00      20 2018-02-28 23:51:00     35
2 2018-03-01 00:37:00      35 2018-03-01 00:42:00     46

相关问题 更多 >

    热门问题