我的数据有两个以天为单位的日期字段,但在数千万行中,某些行存在错误。为了速度和内存限制,我宁愿在读入数据后立即将列转换为日期时间,但我似乎无法强制该过程离开 NaT
对于无效的字符串而不是引发错误。我可以在字段中读取 uint32
对于稍后强制转换为日期时间,但一旦我们有了 parse_dates
,这似乎不必要地慢选项。
示例数据位于帖子底部。
只要数据始终格式正确,这种方法就可以很好地工作:pd.read_table(filename,usecols=[0,8,9,11],parse_dates=[1,2])
但是,如果某些行无法转换,这会导致 dtype 对象,然后后续操作会中断。
pd.read_table(filename,usecols=[0,8,9,11],parse_dates=[1,2],dtype={'LopNr': np.uint32,'INDATUMA': np.uint32,'UTDATUMA': np.uint32,'DIAGNOS': np.object})
,假设数据类型在数据进入转换器之前应用于数据,则某些行中的字符串会出现问题: ValueError: invalid literal for long() with base 10: 'string'
pd.read_table(filename,usecols=[0,8,9,11],parse_dates=[1,2],dtype={'LopNr': np.uint32,'INDATUMA': 'datetime64','UTDATUMA': 'datetime64','DIAGNOS': np.object})
两者都不起作用,如 TypeError: the dtype <M8 is not supported for parsing, pass this column using parse_dates instead
如果我准备好忽略字符串格式不可解析为日期的行,那么处理此类数据的有效方法是什么?
示例数据(为了保密,所有有意义的数字都替换为 .),请注意最后两行中的两个日期格式错误:
LopNr AR KON ALDER LKF SJUKHUS MVO LT_KLIN INDATUMA UTDATUMA HDIA DIAGNOS OP PVARD INSATT UTSATT VTID EKOD. EKOD. ICD PEKARE OPD. OPD. OPD. OPD. OPD. OPD. OPD. OPD. OPD. OPD.. OPD.. OPD..
.. .... . . ...... ..... ... ... 19970320 19970320 S... S... . . . . W.... ..
.. .... . . ...... ..... ... ... 19970306 19970307 S... S... . . . . W.... ..
.. .... . .. ...... ..... ... ... 19961219 19970208 Z... Z... S... . . . .. W.... ..
.. .... . .. ...... ..... ... ... 19970208 19970320 Z... Z... S... . . . .. W.... ..
.. .... . .. ...... ..... ... ... 19970604 19970611 I... I... I... I... . . . . ..
.. .... . .. ...... ..... ... ... 19970402 19970406 O800A O800A . . . . ..
.. .... . .. ...... ..... ... ... 19970412 19970415 R... R... I... Z... J... . . . . ..
.. .... . .. ...... ..... ... ... 19970520 19970523 R... R... I... J... V.... . . . . .. .
.. .... . .. ...... ..... ... ... 19970504 19970507 I... I... . . . . ..
.. .... . .. ...... ..... ... ... 1997050 19970507 I... I... . . . . ..
.. .... . .. ...... ..... ... ... 19970504 string I... I... . . . . ..
最佳答案
你可以这样做:
parser = lambda x : pd.to_datetime(x, coerce=True)
pd.read_table(..., parse_dates=[0,1], date_parser=parser)
但这并不比仅仅读入然后解析更快。即使在默认情况下,解析也会在读入数据后发生。
df = pd.read_table(...)
df['INDATUMA'] = pd.to_datetime(df['INDATUMA'], coerce=True)
df['UTDATUMA'] = pd.to_datetime(df['UTDATUMA'], coerce=True)
如果您的日期采用相同的格式,通过传递格式您可能会看到非常显着的加速 - 有一个专门针对 YYYYMMDD 格式日期的快速路径。
df = pd.read_table(...)
df['INDATUMA'] = pd.to_datetime(df['INDATUMA'], coerce=True, format='%Y%m%d')
另请注意,在 pandas
的下一个版本 (0.17) 中,coerce
参数将递减,您将传递 errors='coerce'
关于python - 强制日期时间转换,强制日期时间数据类型,使用 pandas 中的 read_table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32443898/