[AstroPy] Add an astropy.table.Table to a multi-extension FITS file?

Erik Bray embray at stsci.edu
Thu Dec 18 10:41:44 EST 2014

On 12/17/2014 08:55 PM, David Kirkby wrote:
> Is it possible to create a table as an astropy.table.Table and then convert it
> to an astropy.fits.io.BinTableHDU suitable for adding to the
> astropy.io.fits.HDUList of a multi-extension file?
> I guess that astropy.table.Table.write already implements this but I didn't see
> how to only generate a new HDU in memory with this API.

Incidentally, there is an open issue for exactly this (patches welcome :):


On 12/17/2014 11:41 PM, J. Xavier Prochaska wrote:
 > I don’t recall where I pulled this syntax, but it works fine:
 >      prihdr = fits.Header()
 >      prihdu = fits.PrimaryHDU(header=prihdr)
 >      #data is an astropy Table
 >      table_hdu = fits.BinTableHDU.from_columns(np.array(data.filled()))
 >      thdulist = fits.HDUList([prihdu, table_hdu])
 >      thdulist.writeto(outfil,clobber=True)

Xavier's workaround is good for now.  However, there are parts of it that are 
unnecessary.  For example, creating an empty primary HDU is unnecessary unless 
you intend to put additional keyword in the primary header.  Otherwise just:


will suffice (no need for any of the intermediate steps).

Also I think

table_hdu = fits.BinTableHDU.from_columns(np.array(data))

is good enough in most cases.  Calling filled() is only necessary if you have 
masked data.  So really, getting a BinTableHDU from a Table boils down to the 
one line above.


More information about the AstroPy mailing list