在 Python 中计算两个格式化日期之间的天数会导致"OverflowError: int too big to convert"



我有一个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 = Trueerrors = '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

相关内容

最新更新