项目场景:
从oracle读取数据后转为dataframe形式,然后通过to_feather()存入ft文件
之后通过pandas.read_feather()从文件中读取dataframe数据
数据类型包括date,并且有超出时间戳的数据,比如0002-12-01 00:00:00或9999-10-01 00:00:00
问题描述:
存入feather文件时正常,从ft文件读取时出错,错误如下
大概意思是从timestamp[us]强制转换为timestamp[ns]将导致时间戳越界
pyarrow.lib.ArrowInvalid: Casting from timestamp[us] to timestamp[ns] would result in out of bounds timestamp
原因分析:
就是date类型的某些数据超过了时间戳的界限
解决方案:
在网上实在搜不到能一眼看懂的解决方案,直到在pandas官网上一直死磕Representing out-of-bounds spans部分,发现了可行的解决方案:
pandas.PeriodIndex
pandas官网上的示例如下
In [413]: span = pd.period_range('1215-01-01', '1381-01-01', freq='D')
In [414]: span
Out[414]:
PeriodIndex(['1215-01-01', '1215-01-02', '1215-01-03', '1215-01-04',
'1215-01-05', '1215-01-06', '1215-01-07', '1215-01-08',
'1215-01-09', '1215-01-10',
...
'1380-12-23', '1380-12-24', '1380-12-25', '1380-12-26',
'1380-12-27', '1380-12-28', '1380-12-29', '1380-12-30',
'1380-12-31', '1381-01-01'],
dtype='period[D]', length=60632, freq='D')
这不就是创了个区间的数据,实在没看懂怎么用PeriodIndex
之后直接去看PeriodIndex的用法,发现它的参数里有data,寻思直接调用PeriodIndex(data)把我dataframe里的越界数据调整一下?df['SWHZDJRQ'] = pd.PeriodIndex(df.SWHZDJRQ)
(SWHZDJRQ是我dataframe里日期的列名)
然后报了个错?
ValueError: freq not specified and cannot be inferred
freq没指定,无法判断?那我就加上了freq参数,这个参数的介绍如下
fre:qstr or period object, optional. One of pandas period strings or corresponding objects.
大概是指定精度啥的,然后设为秒df['SWHZDJRQ'] = pd.PeriodIndex(df.SWHZDJRQ,freq='s')
一运行,诶,可以了,没啥错误了,也不报越界了,总算搞定了,折腾了一整天。