首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas使用不同的日期格式(而不是时间戳)合并' date‘键

Pandas使用不同的日期格式(而不是时间戳)合并' date‘键
EN

Stack Overflow用户
提问于 2015-07-30 04:41:49
回答 1查看 3.2K关注 0票数 0

你好堆栈溢出社区,我有一个问题,Pandas不理解我的合并条件。它可以与其他“键”一起工作,但当我将"Date“列作为键时,它就会中断。"Date“列是两个数据帧(而不是时间戳)中的字符串对象。

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

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

代码语言:javascript
复制
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“:

代码语言:javascript
复制
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会以不同的方式读取“Date”列的格式。

下面是数据帧在左合并之前的样子:

代码语言:javascript
复制
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                

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

代码语言:javascript
复制
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‘键的情况下尝试合并,大部分数据传输都是正确的,但这是由于两个键中的重复而导致的多余数据,并且不会准确,因为在合并数据之前,我只需要所有四个键('Date','Hour','Make','Model')都匹配的数据和来自df的任何数据。

在df2中总是会有更多的Make/Model & Hour的副本,所以我只想将合并匹配留给df,而不管df中有多少重复的实例。我也不希望在df中丢失任何数据,所以在df2中找不到的df中的任何日期都应该保留。

如果'Date‘合并条件有效,这是我试图实现的输出:

代码语言:javascript
复制
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列(“月”、“日”、“年”),并将数据类型更改为int64、bool、obj,但也没有成功。因此,我认为这与格式有关。

提前感谢堆栈溢出社区!

EN

回答 1

Stack Overflow用户

发布于 2015-07-30 05:14:55

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

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31710688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档