在Python中计算两个格式化日期之间的天数时,结果为;溢出错误:int太大,无法转换;
我有一个32万行18列的数据框。 其中两列是项目开始日期和项目结束日期。 我只想添加一列,以天为单位显示项目的持续时间在Python中计算两个格式化日期之间的天数时,结果为;溢出错误:int太大,无法转换;,python,sql,dataframe,date,duration,Python,Sql,Dataframe,Date,Duration,我有一个32万行18列的数据框。 其中两列是项目开始日期和项目结束日期。 我只想添加一列,以天为单位显示项目的持续时间 df['proj_duration'] = df['END_FORMATED'] - df['START_FORMATED'] 数据是从SQL Server导入的 日期已格式化(yyyy-mm-dd) 当我运行上面的代码时,出现以下错误: 回溯(最近一次呼叫最后一次): 文件“pandas_libs\tslibs\timedeltas.pyx”,第234行,在 pandas.
df['proj_duration'] = df['END_FORMATED'] - df['START_FORMATED']
数据是从SQL Server导入的
日期已格式化(yyyy-mm-dd)
当我运行上面的代码时,出现以下错误:
回溯(最近一次呼叫最后一次):
文件“pandas_libs\tslibs\timedeltas.pyx”,第234行,在
pandas._libs.tslibs.timedeltas.array_至_timedelta64
TypeError:应为unicode,获得datetime.timedelta
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
df['proj_duration']=df['END_formatted']-df['START_formatted']
文件
“C:\Users\77797\Anaconda3\lib\site packages\pandas\core\ops\common.py”,
第64行,采用新方法
返回方法(自身、其他)
文件
“C:\Users\77797\Anaconda3\lib\site packages\pandas\core\ops\u init\uuuz.py”,
第502行,在包装器中
return _construct_result(左,result,index=left.index,name=res_name)
文件
“C:\Users\77797\Anaconda3\lib\site packages\pandas\core\ops\u init\uuuz.py”,
第475行,输入构造结果
out=左。\构造函数(结果,索引=索引)
文件
“C:\Users\77797\Anaconda3\lib\site packages\pandas\core\series.py”,
第305行,在init
数据=清理数组(数据、索引、数据类型、复制、引发\u转换\u失败=真)
文件
“C:\Users\77797\Anaconda3\lib\site packages\pandas\core\construction.py”,
第424行,在sanitize_数组中
Subar=\u try\u cast(数据、数据类型、复制、引发\u cast\u失败)
文件
“C:\Users\77797\Anaconda3\lib\site packages\pandas\core\construction.py”,
第537行,试播
SubAr=可能转换为日期时间(arr,dtype)
文件
“C:\Users\77797\Anaconda3\lib\site packages\pandas\core\dtypes\cast.py”,
第1346行,在可能的日期时间
值=可能推断为日期时间型(值)
文件
“C:\Users\77797\Anaconda3\lib\site packages\pandas\core\dtypes\cast.py”,
第1198行,在“可能推断”到“日期时间”中
值=try_timedelta(v)
文件
“C:\Users\77797\Anaconda3\lib\site packages\pandas\core\dtypes\cast.py”,
第1187行,在try_timedelta中
返回到_timedelta(v)。_ndarray_值。重塑(形状)
文件
“C:\Users\77797\Anaconda3\lib\site packages\pandas\core\tools\timedeltas.py”,
第102行,输入至_timedelta
return\u convert\u listlike(arg,unit=unit,errors=errors)
文件
“C:\Users\77797\Anaconda3\lib\site packages\pandas\core\tools\timedeltas.py”,
第140行,在转换列表中
值=序列\u至\u td64ns(参数,单位=单位,错误=错误,副本=假)[0]
文件
“C:\Users\77797\Anaconda3\lib\site packages\pandas\core\arrays\timedeltas.py”,
第943行,按顺序\u至\u td64ns
数据=对象\u至\u td64ns(数据,单位=单位,错误=错误)
文件
“C:\Users\77797\Anaconda3\lib\site packages\pandas\core\arrays\timedeltas.py”,
第1052行,在对象\u到\u td64ns中
结果=数组\u到\u timedelta64(值,单位=单位,错误=错误)
文件“pandas_libs\tslibs\timedeltas.pyx”,第239行,在
pandas._libs.tslibs.timedeltas.array_至_timedelta64
文件“pandas_libs\tslibs\timedeltas.pyx”,第198行,在
pandas._libs.tslibs.timedelta.convert_to_timedelta64
文件“pandas_libs\tslibs\timedeltas.pyx”,第143行,在
熊猫。_libs.tslibs.timedelta.delta_至_纳秒
溢出错误: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之间的日期,根据 尝试将每个系列强制转换为datetime对象,以便在某些条目不是预期格式时捕获,使用
infere\u datetime\u format=True
和errors='concure'
,如下所示:
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
@何塞·维加:谢谢。我运行了它,得到了这个错误:“越界时间:越界纳秒时间戳:1009-01-06 00:00:00”@SalmanTabatabai更新了答案以匹配您的问题。现在应该可以工作了,但是要注意可能由此产生的NaT值。没错!我意识到有人把销售截止日期定在3020年!!!!谢谢你的跟进。