Python改变CSV文件特定列中字符串(日期)的格式

2024-05-19 01:48:01 发布

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

我试图将csv文件中名为date的列的值转换为另一种格式,例如:

原始记录

transfer id,player id,player name,season,date
732058,1126,,12/13,Jul 1- 2012
581951,1126,,11/12,Jun 3- 2011
295000,1126,,09/10,Aug 12- 2009
98459,1126,,06/07,Nov 6- 2006
7267,1126,,03/04,Jul 2- 2003
...

我想得到这样的结果

^{pr2}$

由于csv文件中存储的数据是字符串,我编写了一个可以转换日期格式的方法:

import time

# convert date from original format to new format
def date_convert(_date,fmt_original,fmt_new):
    if date_validate(_date,fmt_original):
        timeArray=time.strptime(_date,fmt_original)
        return time.strftime(fmt_new,timeArray)
    else:
        return '0001-01-01'

def date_validate(_date,fmt_original):
    try:
        time.strptime(_date, fmt_original)
        return True
    except ValueError:
        return False

然后我尝试更改csv文件中的日期,并尝试利用pandas,正如@MaxU所说:

我写了一个代码

import pandas as pd
import date_format

df=pd.read_csv('the_transfer_info_test.csv',delimiter=',')
df.date=date_format.date_convert(df.date, '%b %d- %Y', '%Y-%m-%d')
print df

一开始我遇到了这样一个例外:

TypeError: expected string or buffer

我想这可能与数据类型有关,因为数据框日期得到熊猫系列的一个类型,所以我编码为

df.date=date_format.date_convert(str(df.date), '%b %d- %Y', '%Y-%m-%d')

但是它返回所有的0001-01-01,这是date_格式的异常日期,因此我搜索了如何将序列转换为字符串,并找到了如下的答案 @Amit,我尝试了以下方法:

df['date'].astype(basestring)
df.date.apply(str)
df['date'].astype(str)
df['date'].astype('str')

但它们不适合我,我也有同样的例外:

TypeError: expected string or buffer

我想知道如何在csv文件中转换特定的列值,不管是否使用pandas。在

顺便说一句,我的python版本是2.7.12,带有IDE PyCharm和Anoconda 4.0.0和pandas 0.18.0。

谢谢你的帮助。在


感谢@jezrael,上面的示例都很好用,这是我的错,我想简化我的问题,简化我的问题,实际上我的原始数据如下:

transfer id,player id,player name,season,date,move from,move from id,move to,move to id,market value,transfer fee
732058,1126,,12/13,Jul 1- 2012,e-frankfurt,24,1-fc-koln,3,£1.06m,Free transfer
581951,1126,,11/12,Jul 1- 2011,fc-st-pauli,35,eintracht-frankfurt,24,£1.70m,£425k
295000,1126,,09/10,Jul 1- 2009,alem-aachen,8,fc-st-pauli,35,£850k,Free transfer
98459,1126,,06/07,Jul 1- 2006,1860-munich,72,alemannia-aachen,8,£1.36m,£765k
7267,1126,,03/04,Jul 1- 2003,stuttgart-ii,102,tsv-1860-munich,72,-,£21k
...

实际上,这些方法可以很好地处理我的一部分数据我的意思是如果我用相同格式的几行代码来测试它,但是当涉及到大约40000条记录的原始数据时,这些方法不再起作用了,对于to_datetime方法,我得到了一个类似

ValueError: time data '-' does not match format '%b %d- %Y' (match)

第二种方法是parse_dates,日期格式与Jun 11- 2016相同。在

再次感谢您的帮助。在


Tags: 文件csv方法idformatconvertdfdate
1条回答
网友
1楼 · 发布于 2024-05-19 01:48:01

我想你需要^{}

df.date = pd.to_datetime(df.date, format='%b %d- %Y')
print (df)
   transfer id  player id  player name season       date
0       732058       1126          NaN  12/13 2012-07-01
1       581951       1126          NaN  11/12 2011-06-03
2       295000       1126          NaN  09/10 2009-08-12
3        98459       1126          NaN  06/07 2006-11-06
4         7267       1126          NaN  03/04 2003-07-02

但似乎您可以在^{}中使用参数parse_dates

^{pr2}$

按注释编辑:

您需要参数errors='coerce'来替换错误数据(其格式与NaT不匹配):

df.date = pd.to_datetime(df.date, format='%b %d- %Y', errors='coerce')

print (df)
   transfer id  player id  player name season         date     move from  \
0       732058       1126          NaN  12/13  Jul 1- 2012   e-frankfurt   
1       581951       1126          NaN  11/12  Jul 1- 2011   fc-st-pauli   
2       295000       1126          NaN  09/10  Jul 1- 2009   alem-aachen   
3        98459       1126          NaN  06/07  Jul 1- 2006   1860-munich   
4         7267       1126          NaN  03/04  Jul 1- 2003  stuttgart-ii   
5         7267       1126          NaN  03/04            -  stuttgart-ii   

   move from id              move to  move to id market value   transfer fee  
0            24            1-fc-koln           3       £1.06m  Free transfer  
1            35  eintracht-frankfurt          24       £1.70m          £425k  
2             8          fc-st-pauli          35        £850k  Free transfer  
3            72     alemannia-aachen           8       £1.36m          £765k  
4           102      tsv-1860-munich          72            -           £21k  
5           102      tsv-1860-munich          72            -           £21k 
df.date = pd.to_datetime(df.date, format='%b %d- %Y', errors='coerce')
print (df)
   transfer id  player id  player name season       date     move from  \
0       732058       1126          NaN  12/13 2012-07-01   e-frankfurt   
1       581951       1126          NaN  11/12 2011-07-01   fc-st-pauli   
2       295000       1126          NaN  09/10 2009-07-01   alem-aachen   
3        98459       1126          NaN  06/07 2006-07-01   1860-munich   
4         7267       1126          NaN  03/04 2003-07-01  stuttgart-ii   
5         7267       1126          NaN  03/04        NaT  stuttgart-ii   

   move from id              move to  move to id market value   transfer fee  
0            24            1-fc-koln           3       £1.06m  Free transfer  
1            35  eintracht-frankfurt          24       £1.70m          £425k  
2             8          fc-st-pauli          35        £850k  Free transfer  
3            72     alemannia-aachen           8       £1.36m          £765k  
4           102      tsv-1860-munich          72            -           £21k  
5           102      tsv-1860-munich          72            -           £21k  

相关问题 更多 >

    热门问题