117 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import numpy as np
 | |
| from datetime import datetime,timedelta
 | |
| import pandas as pd
 | |
| from os import path,makedirs,remove
 | |
| from pathlib import Path
 | |
| 
 | |
| from ..utils.try_download import wget_download
 | |
| 
 | |
| def download_sw_nrlmsise00(direc=None):
 | |
|     '''
 | |
|     Download or update the space weather data from www.celestrak.com
 | |
| 
 | |
|     Usage: 
 | |
|     swfile = download_sw([direc])
 | |
| 
 | |
|     Inputs: 
 | |
|     direc -> [str, optional] Directory for storing the space weather data
 | |
|     
 | |
|     Outputs: 
 | |
|     swfile -> [str] Path of the space weather data
 | |
| 
 | |
|     Examples:
 | |
|     >>> swfile = download_sw()
 | |
|     >>> swfile = download_sw('sw-data/')
 | |
|     '''
 | |
|     
 | |
|     if direc is None:
 | |
|         home = str(Path.home())
 | |
|         direc = home + '/src/sw-data/'
 | |
|     
 | |
|     swfile = direc + 'SW-All.csv'
 | |
|     url = 'https://www.celestrak.com/SpaceData/SW-All.csv'
 | |
| 
 | |
|     if not path.exists(direc): makedirs(direc)
 | |
|     if not path.exists(swfile):
 | |
|         desc = "Downloading the Space Weather file '{:s}' from CELESTRAK".format('SW-All.csv')
 | |
|         wget_download(url,swfile,desc)
 | |
|     else:
 | |
|         modified_time = datetime.fromtimestamp(path.getmtime(swfile))
 | |
|         if datetime.now() > modified_time + timedelta(days=7):
 | |
|             remove(swfile)
 | |
|             desc = "Updating the Space Weather file '{:s}' from CELESTRAK".format('SW-All.csv')
 | |
|             wget_download(url,swfile,desc)  
 | |
|         else:
 | |
|             print("The Space Weather file '{:s}' in {:s} is already the latest.".format('SW-All.csv',direc))   
 | |
|     return swfile
 | |
| 
 | |
| def read_sw_nrlmsise00(swfile):
 | |
|     '''
 | |
|     Parse and read the space weather data
 | |
| 
 | |
|     Usage: 
 | |
|     sw_obs_pre = read_sw_nrlmsise00(swfile)
 | |
| 
 | |
|     Inputs: 
 | |
|     swfile -> [str] Path of the space weather data
 | |
|     
 | |
|     Outputs: 
 | |
|     sw_obs_pre -> [2d str array] Content of the space weather data
 | |
| 
 | |
|     Examples:
 | |
|     >>> swfile = 'sw-data/SW-All.csv'
 | |
|     >>> sw_obs_pre = read_sw(swfile)
 | |
|     >>> print(sw_obs_pre)
 | |
|     [['2020' '01' '07' ... '72.4' '68.0' '71.0']
 | |
|     ['2020' '01' '06' ... '72.4' '68.1' '70.9']
 | |
|     ...
 | |
|     ...
 | |
|     ['1957' '10' '02' ... '253.3' '267.4' '231.7']
 | |
|     ['1957' '10' '01' ... '269.3' '266.6' '230.9']]
 | |
|     '''
 | |
|     sw_df = pd.read_csv(swfile)  
 | |
|     sw_df.dropna(subset=['C9'],inplace=True)
 | |
|     # Sort from newest date to past
 | |
|     sw_df.sort_values(by=['DATE'],ascending=False,inplace=True)
 | |
|     sw_df.reset_index(drop=True,inplace=True)
 | |
|     return sw_df
 | |
| 
 | |
| def get_sw(sw_df,t_ymd,hour):
 | |
|     '''
 | |
|     Extract the necessary parameters describing the solar activity and geomagnetic activity from the space weather data.
 | |
| 
 | |
|     Usage: 
 | |
|     f107A,f107,ap,aph = get_sw(SW_OBS_PRE,t_ymd,hour)
 | |
| 
 | |
|     Inputs: 
 | |
|     SW_OBS_PRE -> [2d str array] Content of the space weather data
 | |
|     t_ymd -> [str array or list] ['year','month','day']
 | |
|     hour -> []
 | |
|     
 | |
|     Outputs: 
 | |
|     f107A -> [float] 81-day average of F10.7 flux
 | |
|     f107 -> [float] daily F10.7 flux for previous day
 | |
|     ap -> [int] daily magnetic index 
 | |
|     aph -> [float array] 3-hour magnetic index 
 | |
| 
 | |
|     Examples:
 | |
|     >>> f107A,f107,ap,aph = get_sw(SW_OBS_PRE,t_ymd,hour)
 | |
|     '''
 | |
| 
 | |
|     ymds = sw_df['DATE']
 | |
|     j_, = np.where(sw_df['DATE'] == t_ymd)
 | |
|     j = j_[0]
 | |
|     f107A,f107,ap = sw_df.iloc[j]['F10.7_OBS_CENTER81'],sw_df.iloc[j+1]['F10.7_OBS'],sw_df.iloc[j]['AP_AVG']
 | |
|     aph_tmp_b0 = sw_df.iloc[j]['AP1':'AP8']   
 | |
|     i = int(np.floor_divide(hour,3))
 | |
|     ap_c = aph_tmp_b0[i]
 | |
|     aph_tmp_b1 = sw_df.iloc[j+1]['AP1':'AP8']
 | |
|     aph_tmp_b2 = sw_df.iloc[j+2]['AP1':'AP8']
 | |
|     aph_tmp_b3 = sw_df.iloc[j+3]['AP1':'AP8']
 | |
|     aph_tmp = np.hstack((aph_tmp_b3,aph_tmp_b2,aph_tmp_b1,aph_tmp_b0))[::-1]
 | |
|     apc_index = 7-i
 | |
|     aph_c369 = aph_tmp[apc_index:apc_index+4]
 | |
|     aph_1233 = np.average(aph_tmp[apc_index+4:apc_index+12])
 | |
|     aph_3657 = np.average(aph_tmp[apc_index+12:apc_index+20])
 | |
|     aph = np.hstack((ap,aph_c369,aph_1233,aph_3657))
 | |
|     return f107A,f107,ap,aph |