In [1]:
# import urllib.request
import urllib
下面兩個 cell 分別演示如何使用 urllib來透過 url 抓取資料
執行後會多出兩個檔案 "spec.fits"和 "astro_table.txt", 可以用以前熟悉的工具先看看資料的內容與格式, 這樣比較有 fu...
In [2]:
fitsurl="http://dr10.sdss3.org/sas/dr10/sdss/spectro/redux/26/spectra/0651/spec-0651-52141-0569.fits"
#urllib.request.urlretrieve(fitsurl,"spec.fits")
urllib.urlretrieve(fitsurl,"spec.fits")
Out[2]:
In [3]:
texturl="http://services.swpc.noaa.gov/text/predicted-sunspot-radio-flux.txt"
#urllib.request.urlretrieve(texturl, "astro_table.txt")
urllib.urlretrieve(texturl, "astro_table.txt")
Out[3]:
In [14]:
from astropy.io import fits
hdulist = fits.open('spec.fits')
hdulist.info()
hdulist 顧名思義, 就是 a list of Header/Data Unit (廢話), 關於 FITS檔案的格式, 請參閱 http://fits.gsfc.nasa.gov/fits_primer.html 裡面有詳盡的說明
hdulist.info() 會把每個 element的摘要列出來, 以上面的例子來說, 就是讀進來的 spec.fits 他有 12個 units, 第 0個就是個純的 header, 第 1,2,3個 unit應該是一些 meta data, 真正的科學資料是從第 4個 unit開始, 格式為 binary table, 接下來我們就用第四個 unit 來作演示
通常在不太了解新的物件時, dir() 是我們的好朋友, 方便我們猜測可以對這個陌生的物件做些什麼事情。 所以, 就 dir()吧
In [9]:
dir(hdulist[4])
Out[9]:
雖然落落長一串, 希望你的眼睛沒有什麼業障, 可以發現有一些有趣的屬性/方法, 像是 data, dump, writeto... 等等 接下來就繼續冒險前進, 用點點 (.) 來探索新世界吧
所以就 .data
In [15]:
hdulist[4].data
Out[15]:
In [16]:
hdulist[4].data["flux"]
Out[16]:
好滴... 這個演示就先告個段落, 記得要把打開的東西 (hdulist) 關起來, 養成好習慣以後才不會很難改
In [11]:
hdulist.close()
In [6]:
# 尚需要更合適的檔案來當範例
In [21]:
import numpy as np
In [ ]:
讀進的array = np.loadtxt("檔名")
In [ ]:
# 對讀進的array做一些運算後存成新array,然後將新array寫到一個新檔案中 (代補)
In [ ]:
np.savetxt('新檔名', 新array)
astropy 的 ascii 提供相當完整的 ascii 讀取方案, 除了基本的格式外, 還支援 csv, cds (vizier), latex, DAOPHOT, Sextractor... 天文領域中常見的 ascii 表格大概都可以無痛讀取, 不需要自己花時間解析
用法也很直覺, 如下:
In [18]:
from astropy.io import ascii
#data = ascii.read("astro_table.txt")
data = ascii.read("astro_table.txt",data_start=2)
print(data)
read() 出來的是個 table 物件, dir()的樂趣我就留給各位, 下面直接舉兩個常用的例子:
In [19]:
print(data["col5","col1"])
In [23]:
d = np.where((data["col1"] >= 2017) & (data["col1"] <= 2019) & (data["col2"] >=6) & (data["col2"] <=9))
print(d)
print(data[d]["col1","col2","col3"])
In [ ]:
dir(data)
In [ ]:
data.write("out", format="ascii")