gpt4 book ai didi

python - 强制日期时间转换,强制日期时间数据类型,使用 pandas 中的 read_table

转载 作者:行者123 更新时间:2023-12-01 04:30:41 26 4
gpt4 key购买 nike

我的数据有两个以天为单位的日期字段,但在数千万行中,某些行存在错误。为了速度和内存限制,我宁愿在读入数据后立即将列转换为日期时间,但我似乎无法强制该过程离开 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com