【问题标题】:reading dat files with pandas by format string通过格式字符串用 pandas 读取 dat 文件
【发布时间】:2019-05-16 13:31:47
【问题描述】:

使用pd.read_csv('file.dat', sep='\s+')pd.read_fwf('file.dat', widths=[7, ..])方法在pandas中读取一个固定宽度的.dat文件并不是很复杂。但是在文件中也给出了这样的格式字符串:

Format = (i7,1x,i7,1x,i2,1x,i2,1x,i2,1x,f5.1,1x,i4,1x,3i,1x,f4.1,1x,i1,1x,f4.1,1x,i3,1x,i4,1x,i4,1x,i3,1x,i4,2x,i1)

查看列内容,我假设字符表示数据类型(i->int,f->float,x->seperator),数字显然是列的宽度。这是标准符号吗?是否有一种更 Python 的方式来读取数据文件,只需传递此格式字符串并使脚本针对数据文件中的格式更改进行保存?

我注意到 read_fwf() 函数的格式参数,但它需要一个对 (int, int) 的列表,而不是给定的格式字符串的类型。 数据文件的第一行:

对列表 (int, int)

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这是一种使用 C printf 约定来指示格式的非常标准的方法。仅当您尝试以相同的方式编写文件时,格式才真正重要。出于将其全部读入熊猫的目的,您并不在乎。如果您想在读取时控制每列的​​特定数据类型,请使用 dtype 参数。在下面的示例中,我说将列“a”设为 64 位浮点数,将“b”列设为 32 位整数。

    my_dtypes = {‘a’: np.float64, ‘b’: np.int32} 
    pd.read_csv('file.dat', sep='\s+', dtype=my_dtypes)
    

    您不必指定每一列,只需指定您想要的列即可。尽管默认情况下,熊猫很可能已经弄清楚了其中的大部分内容。在您致电 read_csv() 后尝试

    df = pd.read_csv(....)
    print(df.dtypes)
    

    这将向您显示每列的数据类型。

    【讨论】:

    • 啊对.. printf 约定。我只想读取数据,但是使用 dict 以与更改列名相同的方式更改 dtypes 的提示是一个很好的提示。谢谢
    • 大声笑,现在我再次查看它不是 C,而是 FORTRAN FORMAT 语句约定。 “X”是赠品。
    猜你喜欢
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 2013-04-16
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    相关资源
    最近更新 更多