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

标签 python pandas data-cleaning

我有一个大数据集,一些用户将数据放在 csv 上。我使用 panda 将 CSV 转换为数据框。该列超过 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 循环if 语句 或我可以跳过此类问题的东西?

如果日期时间失败,我将强制使用同样有效的 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]]        

最佳答案

您首先必须使用 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

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

关于仅在 Pandas 中转换为年份的 Python 清理日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24272398/

相关文章:

python - Azure函数不执行其他Python函数

python - Pandas:给定不均匀空间的索引列表对数据帧进行重新采样

r - 使用 dplyr 的每个组的前 "n"行——每个组的数量不同

python - Visual Studio 代码交互式 Python 控制台

python - 使用 Python BeautifulSoup 从网页中抓取没有 id 或类的元素

Python - 使用 Pandas 和 openpyxl 修改现有的 excel

pandas - 在 Pandas 中查找不适合日期时间格式的行

python - 根据行的先前值填充 NaN

python - 使用来自另一个 pandas DF 的最小值的 id 填充 pandas 列

mysql - 如何将没有模式的一列更改为明确定义的行和列?