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

标签 python parsing datetime pandas converters

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

相关文章:

python-3.x - Python - 具有多个时区的 Pandas 日期时间列

java - 如何从 jython 中的 java 类获取接口(interface)列表?

Python - 提取并修改linux目录中所有文件中的文件路径

python - 更改 Seaborn 热图颜色条的高度

linux - 从shell中的json中提取特定元素的值

algorithm - 用函数解析表达式

mysql - 为什么我们必须在插入数据库之前解析日期?

python - 从 MIDI 设备实时获取输入(Python)

c# - 程序不允许我使用 MySQL 的 .net 连接器更新 SQL 服务器中的日期时间列

python - 用 pandas 计算每天的值总数