我有一个32万行18列的Dataframe。其中两列是项目开始日期和项目结束日期。我只想添加一个以天为单位的项目持续时间列。
df['proj_duration'] = df['END_FORMATED'] - df['START_FORMATED']
数据是从sql server导入的。
日期已格式化(yyyy-mm-dd)。
运行上述代码时,出现以下错误:
回溯(最近一次呼叫):
文件“pandas\libs\tslibs\timedeltas.pyx”,第234行,在pandas.\u libs.tslibs.timedeltas.array\u to \u timedelta64中
typeerror:应为unicode,获取datetime.timedelta
在处理上述异常时,发生了另一个异常:
回溯(最近一次呼叫):
文件“”,第1行,在df['proj\u duration']=df['end\u formatted']-df['start\u formatted']
文件“c:\users\77797\anaconda3\lib\site packages\pandas\core\ops\common.py”,第64行,在new\u method return method(self,other)中
文件“c:\users\77797\anaconda3\lib\site packages\pandas\core\ops\u init \uuuuu.py”,第502行, Package 器返回\u construct \u result(left,result,index=left.index,name=res\u name)
文件“c:\users\77797\anaconda3\lib\site packages\pandas\core\ops\u init \uuux.py”,第475行,in\u construct\u result out=left.\u constructor(result,index=index)
文件“c:\users\77797\anaconda3\lib\site packages\pandas\core\series.py”,第305行,init data=sanitize\u array(data,index,dtype,copy,raise\u cast\u failure=true)
文件“c:\users\77797\anaconda3\lib\site packages\pandas\core\construction.py”,第424行,在sanitize\u array subar=\u try\u cast(data,dtype,copy,raise\u cast\u failure)中
文件“c:\users\77797\anaconda3\lib\site packages\pandas\core\construction.py”,第537行,in\u try\u cast subar=maybe\u cast \u to \u datetime(arr,dtype)
文件“c:\users\77797\anaconda3\lib\site packages\pandas\core\dtypes\cast.py”,第1346行,在maybe \u cast \u to \u datetime value=maybe \u infere \u to \u datetimelike(value)中
文件“c:\users\77797\anaconda3\lib\site packages\pandas\core\dtypes\cast.py”,第1198行,在maybe\u infere\u to\u datetimelike value=try\u timedelta(v)中
文件“c:\users\77797\anaconda3\lib\site packages\pandas\core\dtypes\cast.py”,第1187行,在try\u timedelta return to\u timedelta(v)中
文件“c:\users\77797\anaconda3\lib\site packages\pandas\core\tools\timedelta.py”,第102行,in to\u 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 convert \u listlike value=sequence \u to \u td64ns(arg,unit=unit,errors=errors,copy=false)[0]
文件“c:\users\77797\anaconda3\lib\site packages\pandas\core\arrays\timedeltas.py”,第943行,顺序为\u to \u td64ns data=objects \u to \u td64ns(data,unit=unit,errors=errors)
文件“c:\users\77797\anaconda3\lib\site packages\pandas\core\arrays\timedeltas.py”,第1052行,在objects\u to\u td64ns result=array\u to\u timedelta64(值,unit=unit,errors=errors)中
文件“pandas\libs\tslibs\timedeltas.pyx”,第239行,在pandas.\u libs.tslibs.timedeltas.array\u to \u timedelta64中
文件“pandas\libs\tslibs\timedeltas.pyx”,第198行,在pandas.\u libs.tslibs.timedeltas.convert\u to\u timedelta64中
文件“pandas\libs\tslibs\timedeltas.pyx”,第143行,在pandas.\u libs.tslibs.timedeltas.delta到\u纳秒
溢出错误: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
这表明问题并不存在于所有数据集中,而只存在于某些行中。
你知道我怎么解决这个问题吗?谢谢!
1条答案
按热度按时间y53ybaqx1#
似乎您的sql数据集中有一个日期设置为1009-01-06。根据这份官方文件,Pandas只知道1677-09-21和2262-04-11之间的日期。
尝试将每个序列强制转换为datetime对象,以便在某个条目不是预期格式时捕获,并使用
infer_datetime_format = True
以及errors = 'coerce'
具体如下:这将在无法使用时设置nat值
pd.to_datetime()
,从而导致此df: