我有一个32万行18列的DataFrame。其中两列是项目开始日期和项目结束日期。我只是想添加一个以天为单位的项目持续时间列。
df['proj_duration'] = df['END_FORMATED'] - df['START_FORMATED']
数据是从SQL Server导入的。
日期的格式为(yyyy-mm-dd(。
当我运行上面的代码时,我得到了这个错误:
Traceback(最后一次调用(:
文件";pandas_libs\tslibs\timedeltas.pyx";,第234行,在熊猫_libs.tslibs.timedeltas.array_to_timedelta64
类型错误:应为unicode,得到的是datetime.timedelta
在处理上述异常的过程中,发生了另一个异常:
追踪(最近一次通话(:
文件"&";,第1行,在df['proj_duration']=df['END_FORMATED']-df['START_FORMATED']
文件"C: \Users\77797\Anaconda3\lib\site-packages\pandas\core\ops\common.py";,第64行,在new_method中返回方法(自身、其他(
文件"C: \Users\77797\Anaconda3\lib\site packages\pandas\core\ops_init_.py",第502行,包装中return _construct_result(left,result,index=left.index,name=res_name(
文件"C: \Users\77797\Anaconda3\lib\site packages\pandas\core\ops_init_.py",第475行,在_construct_result中out=左_构造函数(结果,索引=索引(
文件"C: \Users\77797\Anaconda3\lib\site-packages\pandas\core\series.py";,第305行,在initdata=sance_array(数据、索引、数据类型、副本、raise_cast_failure=True(中
文件"C: \Users\777797\Anaconda3\lib\site-packages\pandas\core\constructure.py";,行424,在消毒数组中subarr=_try_cast(数据、数据类型、副本、raise_cast_failure(
文件"C: \Users\777797\Anaconda3\lib\site-packages\pandas\core\constructure.py";,第537行,在_try_cast中subarr=maybe_cast_to_detime(arr,dtype(
文件"C: \Users\77797\Anaconda3\lib\site-packages\pandas\core\dtypes\cast.py",第1346行,在可能的时间value=maybe_infer_to_detimelike(value(
文件"C: \Users\77797\Anaconda3\lib\site-packages\pandas\core\dtypes\cast.py",第1198行,在maybe_infer_to_detimelike中value=try_timedelta(v(
文件"C: \Users\77797\Anaconda3\lib\site-packages\pandas\core\dtypes\cast.py",第1187行,在try_timedelta返回_timedelta(v(_ndarray_values.整形(形状(
文件"C: \Users\77797\Anaconda3\lib\site-packages\pandas\core\tools\timedeltas.py";,第102行,to_timedeltareturn _convert_listlike(arg,unit=unit,errors=errors(
文件"C: \Users\77797\Anaconda3\lib\site-packages\pandas\core\tools\timedeltas.py";,第140行,在_convert_listlike中value=sequence_to_td64ns(arg,unit=unit,errors=errors,copy=False([0]
文件"C: \Users\77797\Anaconda3\lib\site-packages\pandas\core\arrays \timedeltas.py";,第943行,按sequence_to_td64nsdata=objects_to_td64ns(数据,单位=单位,错误=错误(
文件"C: \Users\77797\Anaconda3\lib\site-packages\pandas\core\arrays \timedeltas.py";,第1052行,在objects_to_td64ns中result=array_to_timedelta64(值,单位=单位,错误=错误(
文件";pandas_libs\tslibs\timedeltas.pyx";,第239行,in熊猫_libs.tslibs.timedeltas.array_to_timedelta64
文件";pandas_libs\tslibs\timedeltas.pyx";,第198行,in熊猫_libs.tslibs.timedeltas.convert_timedelta64
文件";pandas_libs\tslibs\timedeltas.pyx";,第143行,in熊猫_libs.tslibs.timedeltas.delta_to_noneseconds
Overflow错误:int太大,无法转换
我怀疑日期的格式有问题。我试过了:
a = df.head(50000)['END_FORMATED']
b = df.head(50000)['START_FORMATED']
c = a-b
得到了同样的错误。然而,当我在最后50000行中运行它时,它运行得很好:
x = df.tail(50000)['END_FORMATED']
y = df.tail(50000)['START_FORMATED']
z = x-y
这表明问题并不存在于所有数据集中,而仅存在于某些行中。
知道我该怎么解决这个问题吗?谢谢
您的SQL数据集中似乎有一个日期设置为1009-01-06。熊猫只了解1677-09-21和2262-04-11之间的日期,根据这份官方文件。
如果某个条目不是预期格式,请尝试将每个Series强制转换为datetime对象以捕获,infer_datetime_format = True
和errors = 'coerce'
如下所示:
df['START_FORMATED'] = ['2020-05-05', '2020-05-06', '2020-05-07', 1009-01-06]
df['END_FORMATED'] = ['2020-06-05', '2020-06-06', '2020-06-07', '2020-06-08']
df['proj_duration'] = pd.to_datetime(df['END_FORMATED'], infer_datetime_format = True, errors = 'coerce') - pd.to_datetime(df['START_FORMATED'], infer_datetime_format=True, errors = 'coerce')
当无法使用pd.to_datetime()
时,这将设置NaT值,这导致了此df:
START_FORMATED END_FORMATED proj_duration
0 2020-05-05 2020-06-05 31 days
1 2020-05-06 2020-06-06 31 days
2 2020-05-07 2020-06-07 31 days
3 1009-01-06 2020-06-08 NaT