我有一个大数据集,一些用户将数据放在 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/