在日期时间条件下合并两个网球数据集

时间:2017-04-17 19:45:46

标签: python python-3.x pandas merge data-analysis

我长期以来一直在寻找我的问题的答案,在文档中查找但尚未找到任何合适的内容。

我正在尝试合并两个数据集:第一个包含2000-2015网球比赛的重要统计数据,第二个包含网球比赛的赔率以及2001-2016的一些统计数据。

关键困难:

  1. 类似锦标赛的名称在数据集中通常不相同,因此无法使用它们来合并数据集。
  2. 在具有重要统计数据的数据集中,只有比赛开始的日期,而在另一个比赛中有每个比赛的日期。因此,只是日期的平等不起作用。
  3. 下面可能会看到包含一些列的数据集。第一个数据集包含有关匹配的重要统计数据,第二个数据集包括赔率和一般信息。

    matches[['Winner', 'Loser', 'Tournament Start Date']].head()
    
             Winner       Loser        Tournament Start Date
         0 Dupuis A.       Ilie A.       2000-05-01
         1 Gonzalez F.     Mamiit C.     2000-05-01
         2 Srichaphan P.   Lareau S.     2000-05-01
         3 Siemerink J.    Gimelstob J.  2000-05-01
         4 Stoltenberg J.  Moron A.      2000-05-01
    
    
    all_bets[['Winner', 'Loser', 'Date']].head()
    
              Winner        Loser       Date of Match
         0  Clement A.    Gaudenzi A.    2001-01-01 
         1  Goldstein P.  Jones A.       2001-01-01 
         2  Haas T.       Smith L.       2001-01-01 
         3  Henman T.     Rusedski G.    2001-01-01 
         4  Hewitt L.     Arthurs W.     2001-01-01
    

    对于我来说,准确合并数据集的最佳方法是3个条件*:列'Winner','失败'和......的比例等级匹配日期和锦标赛开始日期之间的差异不是大于14天因为:

    1. 两名球员只能在一场锦标赛中相互比赛
    2. 每场锦标赛每年只举行一次
    3. 没有持续时间超过14天的锦标赛。
    4. “胜利者”和“失败者”条件的使用是显而易见的:

      matches_bets = pd.merge(matches, all_bets, on=["Winner", "Loser"], how="inner")
      

      但是,我不明白如何应用日期的不等式条件来合并数据集。

      如果能帮助我完成这项任务,我将不胜感激。

      *在合并数据集时,其他列肯定不是更好用 - 这就是为什么人们在这里看不到它们。

1 个答案:

答案 0 :(得分:1)

首先,将包含日期的列转换为日期时间

matches['Tournament Start Date'] = pd.to_datetime(matches['Tournament Start Date'], format='%Y-%m-%d')
all_bets['Date of Match'] = pd.to_datetime(all_bets['Date of Match'], format='%Y-%m-%d')

然后你应该像以前那样合并

matches_bets = pd.merge(matches, all_bets, on=["Winner", "Loser"], how="inner")

然后通过额外的列[' date_difference']

应用您的条件
matches_bets['date_difference'] = matches_bets['Date of Match'] - matches_bets['Tournament Start Date']
matches_bets['KEEP_IN_PLACE'] = matches_bets['date_difference'].apply(lambda x: 1 if x.days <= 14 else 0)
matches_bets = matches_bets[matches_bets['KEEP_IN_PLACE'] == 1]

你完成了=)