【问题标题】:Formatting with astropy.io.ascii使用 astropy.io.ascii 格式化
【发布时间】:2018-11-14 02:10:22
【问题描述】:

我有一个 AstroPy 数据表:

>>> data

 ra           dec          redshift ... yMeanPSFMag       yMeanPSFMagErr
 ------------ ------------ -------- ... ----------------- --------------------

 0.34011348  26.83588138     5.75 ...  19.49519920349121   0.03307399898767471
 0.66411726  25.84304425     5.82 ...  19.45319938659668   0.04351300001144409
 1.4680833   -0.1154999      5.85 ...  20.118600845336914  0.18635299801826477
 2.10739     -6.43456        5.93 ...  20.439899444580078  0.16982899606227875

我只是想以控制格式的方式输出它:

>>>  df = data['ra', 'dec']
>>>  ascii.write(df, 'temp.dat', overwrite=True, formats="{df['ra']:%3.1f, df['dec']:%8.3f}")

我得到一个:

TypeError: string indices must be integers

我查看了this package,但看不到任何直接有用的东西。

【问题讨论】:

    标签: python dataframe formatting number-formatting astropy


    【解决方案1】:

    我经常这样做。保持接近你所写的内容:

    df = data['ra', 'dec'] 
    ascii.write(df, 'temp.dat', overwrite=True, formats={'ra':'%3.1f','dec':'%8.3f'})
    

    或者我更喜欢的方式是

    aformats = ['%.1f','%.3f']
    oformats = dict(zip(df.colnames, aformats))
    ascii.write(df, 'temp.dat', overwrite=True, formats=oformats)
    

    bc 通常不需要指定总位数。

    【讨论】:

    • 我现在意识到,在一年这样做几十次之后假设我知道 df.colnames 的顺序,但我经常这样做。
    • 这是伟大的格斯。谢谢。一个“奖励”是将诸如 1.2345 之类的格式与 234.5678 相同,即旧货币中的 f8.4!
    • 啊,尼克,你的目标是将小数位居中在某一列中——对——当然,你需要总宽度(%8.4f)。我的用例通常是重新格式化作者在具有机器精度的论文中提交给我们的数字(比如 RA 或具有皮科秒精度的量级),并将其存储在 CSV 文件中以供进一步处理(以列分隔的格式。)
    【解决方案2】:

    要记住的另一个功能是表格本身可以存储所需的格式。这很方便,因为它总是打印得很好,您甚至可以写入 FITS 并返回,并且列格式将被保留。

    In [2]: dat = Table({'ra': [1.2345123, 234.5678232], 'dec': [20.123, -0.1231]})
    In [3]: dat['ra'].format = '8.4f'
    In [4]: dat['dec'].format = '8.4f'
    In [5]: dat
    Out[5]: 
    <Table length=2>
       ra      dec   
    float64  float64 
    -------- --------
      1.2345  20.1230
    234.5678  -0.1231
    
    In [6]: ascii.write(dat, format='fixed_width', delimiter='')
           ra       dec 
       1.2345   20.1230 
     234.5678   -0.1231 
    
    In [7]: dat.write('junk.fits', overwrite=True)
    In [8]: dat2 = Table.read('junk.fits')
    In [9]: dat2
    Out[9]: 
    <Table length=2>
       ra      dec   
    float64  float64 
    -------- --------
      1.2345  20.1230
    234.5678  -0.1231
    

    【讨论】:

    • 嗨,汤姆,谢谢。我不确定它是否能让我一路走好。我的值为 -9.9999949E8,这将返回 -999999490.000。
    猜你喜欢
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多