【问题标题】:Pandas left merging 'Date' keys with different date formats (Not Timestamps)熊猫留下了合并具有不同日期格式的“日期”键(不是时间戳)
【发布时间】:2015-10-21 00:55:17
【问题描述】:

您好 Stack Overflow 社区, 我遇到了 Pandas 不了解我的合并条件的问题。它与其他“键”一起使用,但一旦我将“日期”列作为键包含在内,它就会中断。 “日期”列是两个数据帧中的字符串对象(不是时间戳)。

换句话说,我希望所有 4 个“键”在“左合并”从 df2 到 df 的列之前都相同,而不会丢失 df 中的任何数据。此外,当我在 Excel 中打开 csv 文件时,日期格式看起来完全相同(例如:5/10/2015)。

但是,Pandas 将“csv_file1”,[df] 中的日期列读取为“5-6-2015”:

In [1]: df['Date']
Out[1]: 
         Date 
0   2015-5-11    
1   2015-5-11    
2   2015-5-10   
3   2015-5-12  

Pandas 将“csv_file2”,[df2] 中的日期列读取为“5/6/2015”:

In [2]: df2['Date']
Out[2]: 
         Date 
0   5/11/2015    
1   5/11/2015    
2   5/12/2015 
3   5/13/2015
4   5/17/2015 

两者的数据类型都是“obj”;我不明白为什么 Pandas 会以不同的方式读取“日期”列的格式。

这是左合并之前数据框的样子:

In [3]: df
Out[3]: 
         Date Hour    Make   Model  Gas Rating  Safety Rating
0   2015-5-11    1   Honda   Accord         9             8
1   2015-5-11    0   Toyota  Camry          9            10
2   2015-5-10   23   Chevy   Sonic          7             6
3   2015-5-12   13   Honda   Civic          8             7

In [4]: df2
Out[4]: 
         Date Hour    Make   Model  Mileage  Rating  Speed Rating
0   5/11/2015    1   Honda   Accord             10            7
1   5/11/2015    0   Toyota   Camry             10            7
2   5/12/2015   23   Honda    Civic              9            6
3   5/13/2015   23   Honda    Civic              9            6
4   5/17/2015    7   Chevy   Impala                

这是我尝试左合并时发生的情况:

In [5]: final = pd.merge(left=df, right=df2, how='left', on=['Date', 'Hour', 'Make', 'Model'])


In [6]: final
Out[6]: 
            Date Hour   Make   Model  Gas Rating  Safety Rating  Mileage Rating \
   0   2015-5-11    1  Honda   Accord         9             8           NaN   
   1   2015-5-11    0  Toyota  Camry          9            10           NaN     
   2   2015-5-10   23  Chevy   Sonic          7             6           NaN   
   3   2015-5-12   13  Honda   Civic          8             7           NaN   


     Speed Rating  
   0          NaN  
   1          NaN  
   2          NaN  
   3          NaN    

如果我尝试在不使用“日期”键的情况下进行合并,则数据在大多数情况下都可以正确传输,但由于两者都存在重复,这会导致数据过多,并且不准确,因为我只需要包含所有四个键的数据('Date', 'Hour', 'Make', 'Model') 匹配和 df 中的任何内容,然后再合并数据。

df2 中总会有更多的 Make/Model & Hour 重复项,所以我只想将合并匹配项留给 df,无论 df 中有多少重复实例。我也不希望丢失 df 中的任何数据,因此应保留 df2 中未找到的任何来自 df 的日期。

如果“日期”合并条件有效,这就是我想要实现的输出:

In [7]: final
Out[7]: 
                Date Hour   Make   Model  Gas Rating  Safety Rating  Mileage Rating \
       0   5/11/2015    1  Honda   Accord         9             8            10   
       1   5/11/2015    0  Toyota  Camry          9            10            10     
       2   5/10/2015   23  Chevy   Sonic          7             6           NaN   
       3   5/12/2015   13  Honda   Civic          8             7             8   


          Speed Rating  
       0            7  
       1            7  
       2          NaN  
       3            7 

有人知道为什么会这样吗?我什至尝试将“日期”列拼接成 3 列(“月”、“日”、“年”)并将 dtype 更改为 int64、bool、obj,但也没有成功。所以我认为它与格式有关。

提前感谢 Stack Overflow 社区!

【问题讨论】:

  • "另外,当我在 Excel 中打开 csv 文件时,日期格式看起来完全一样(例如:2015 年 5 月 10 日)。 Excel 会自动以默认查看格式显示日期字符串。
  • 我认为 Excel 可能就是这种情况。但即使我将两列都解析为 3 个整数列(月、日、年),它仍然在 Day 列上中断(所有月份和年份都相同),因为它是唯一不恒定的值
  • 最简单的解决方案可能只是转换为日期时间df['Date'] = pd.to_datetime( df['Date']
  • 最简单的解决方案可能只是使用df['Date'] = pd.to_datetime( df['Date'] 转换为日期时间。这不是格式问题,您将它们作为字符串,而不是日期时间,所以您只是看到实际的字符串。此外,如果您使用read_csv 阅读,请使用parse_dates=True 选项首先避免该问题

标签: python-2.7 pandas merge key dataframe


【解决方案1】:

在合并之前运行以下代码应该将日期转换为通用格式,以便合并正常工作。

import time

df['Date']=time.strftime('%Y-%m-%d',time.strptime(df['date'],'%m/%d/%Y'))
df2['Date']=time.strftime('%Y-%m-%d',time.strptime(df2['date'],'%Y-%m-%d'))

简单地更改其中一个日期会很好,但是 python 时间库使用 %m%d 标记在月份和日期前添加一个前导 0。 %-m%-d 标记不会添加前导 0,但它们不适用于所有系统。请参阅here 了解有关该怪异的更多信息。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-02-23
  • 2017-02-23
  • 2017-01-06
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多