Python清理日期仅在Pandas中转换为年份

时间:2014-06-17 20:05:08

标签: python pandas data-cleansing

我有一个大型数据集,有些用户将数据放在csv上。我将CSV转换为panda的数据框。这列超过1000个条目是一个样本

datestart
5/5/2013
6/12/2013
11/9/2011
4/11/2013
10/16/2011
6/15/2013
6/19/2013
6/16/2013
10/1/2011
1/8/2013
7/15/2013
7/22/2013
7/22/2013
5/5/2013
7/12/2013
7/29/2013
8/1/2013
7/22/2013
3/15/2013
6/17/2013
7/9/2013
3/5/2013
5/10/2013
5/15/2013
6/30/2013
6/30/2013
1/1/2006
00/00/0000
7/1/2013
12/21/2009
8/14/2013
Feb 1 2013

然后我尝试使用

将日期转换为年
df['year']=df['datestart'].astype('timedelta64[Y]')

但它给了我一个错误:

ValueError: Value cannot be converted into object Numpy Time delta

使用Datetime64

df['year']=pd.to_datetime(df['datestart']).astype('datetime64[Y]')

它给了:

"ValueError: Error parsing datetime string ""03/13/2014"" at position 2"

由于该栏目由用户填写,大部分都采用这种格式MM / DD / YYYY,但是有些数据是这样的:2013年2月10日,有一个像00/00/0000这样的条目。我猜不同的格式搞砸了处理。

是否有try loopif statement或其他可以跳过此类问题的内容?

如果日期时间失败,我将强制使用str.extract脚本,该脚本也有效:

year=df['datestart'].str.extract("(?P<month>[0-9]+)(-|\/)(?P<day>[0-9]+)(-|\/)(?P<year>[0-9]+)")


del df['month'], df['day']  

并使用concat来结束这一年。

使用df['year']=pd.to_datetime(df['datestart'],coerce=True, errors ='ignore').astype('datetime64[Y]')错误消息为:

Message File Name   Line    Position    
Traceback               
    <module>    C:\Users\0\Desktop\python\Example.py    23      
    astype  C:\Python33\lib\site-packages\pandas\core\generic.py    2062        
    astype  C:\Python33\lib\site-packages\pandas\core\internals.py  2491        
    apply   C:\Python33\lib\site-packages\pandas\core\internals.py  3728        
    astype  C:\Python33\lib\site-packages\pandas\core\internals.py  1746        
    _astype C:\Python33\lib\site-packages\pandas\core\internals.py  470     
    _astype_nansafe C:\Python33\lib\site-packages\pandas\core\common.py 2222        
TypeError: cannot astype a datetimelike from [datetime64[ns]] to [datetime64[Y]]        

1 个答案:

答案 0 :(得分:5)

您首先必须将带有日期值的列转换为日期时间to_datetime()

df['datestart'] = pd.to_datetime(df['datestart'], coerce=True)

这应该通常灵活地解析不同的格式(此处coerce=True非常重要,可以将无效日期转换为NaT)。

如果你想要年份部分的日期,你可以执行以下操作(似乎直接在pandas列上做astype会出错,但是使用values你可以得到底层的numpy数组):

df['datestart'].values.astype('datetime64[Y]')

这样做的问题在于,由于NaT值而将此值分配给列时再次出现错误(这似乎是一个错误,您可以通过执行df = df.dropna()来解决此问题)。但是,当您将其分配给列时,它会转换回datetime64[ns],因为这是pandas存储日期时间的方式。所以我个人认为如果你想要一个有年份的专栏,你可以做得更好:

df['year'] =  pd.DatetimeIndex(df['datestart']).year

最后一个将以整数形式返回年份。