Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中计算两个格式化日期之间的天数时,结果为;溢出错误:int太大,无法转换;_Python_Sql_Dataframe_Date_Duration - Fatal编程技术网

在Python中计算两个格式化日期之间的天数时,结果为;溢出错误:int太大,无法转换;

在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.

我有一个32万行18列的数据框。 其中两列是项目开始日期和项目结束日期。 我只想添加一列,以天为单位显示项目的持续时间

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年!!!!谢谢你的跟进。