import requests import json import argparse import time import pandas as pd import warnings warnings.filterwarnings("ignore") ## # sample command: python test.py -latitude '' -longitude '' -startYear '' -endYear '' ## parser = argparse.ArgumentParser(description="Process some integers.") parser.add_argument("-latitude", help="Latitude(Degress)") parser.add_argument("-longitude", help="Longitude(Degress)") parser.add_argument("-startYear", help="Start of the Year") parser.add_argument("-endYear", help="End of the Year") parser.add_argument("--verbose", help="display processing information") start = time.time() def main(latitude,longitude,startYear,endYear,verbose): parameters = { #Australia API "latd": latitude, # [deg] "latm": 00, # [deg] "lats": 00, # [deg] "lond": longitude, # [deg] "lonm": 00, # [deg] "lons": 00, # [deg] "elev" : 00, # [km] "year" : None, # [YYYY] "month" : '07', # [MM] "day": '01', # [DD] "Ein": 'D' # [Model] } parameters1 = { #USA API 'lat1': latitude, # [deg] 'lon1': longitude, # [deg] 'model': 'IGRF', # [Model] 'startYear': None, # [year] 'startMonth': 7, # [month] 'startDay':1, # [date] 'resultFormat': 'json', # [format] } hostname = "https://api.geomagnetism.ga.gov.au/agrf" #Australia API hostname1 = "http://www.ngdc.noaa.gov/geomag-web/calculators/calculateDeclination?%s" #USA API df_1=pd.DataFrame() df_2=pd.DataFrame() for year in range(startYear, endYear): if startYear < 1985: for year in range(startYear, 1985): try: parameters1["year"] = year #USA API response = requests.get(hostname1, params= dict(parameters1, ps=str(year))) # extract JSON payload of response as Python dictionary json_payload = response.json() # raise an Exception if we encoutnered any HTTP error codes like 404 response.raise_for_status() except requests.exceptions.ConnectionError as e: # handle any typo errors in url or endpoint, or just patchy internet connection print(e) except requests.exceptions.HTTPError as e: # handle HTTP error codes in the response print(e, json_payload['error']) except requests.exceptions.RequestException as e: # general error handling print(e, json_payload['error']) else: json_payload = response.json() #print(json.dumps(json_payload, indent=4, sort_keys=True)) df = pd.DataFrame(json_payload['result']) new_row = { "SourceFile": hostname1, "Year": year, "Magnetic Declination": df.iloc[0, 2], "Latitude": -35, "Longitude": 145 } df_1 = df_1.append(new_row, ignore_index=True) df_1 = df_1[['Year', 'Latitude', 'Longitude','Magnetic Declination','SourceFile']] df_1.to_csv('magnetic_declination_usa.csv',index=False) for year in range(1985, endYear): try: #Australia API parameters["year"] = year response = requests.get(hostname, params= dict(parameters, ps=str(year))) # extract JSON payload of response as Python dictionary json_payload = response.json() # raise an Exception if we encoutnered any HTTP error codes like 404 response.raise_for_status() except requests.exceptions.ConnectionError as e: # handle any typo errors in url or endpoint, or just patchy internet connection print(e) except requests.exceptions.HTTPError as e: # handle HTTP error codes in the response print(e, json_payload['error']) except requests.exceptions.RequestException as e: # general error handling print(e, json_payload['error']) else: json_payload = response.json() #print(json.dumps(json_payload, indent=4, sort_keys=True)) df = pd.DataFrame(json_payload) new_row = { "SourceFile": hostname, "Year": year, "Magnetic Declination": df.iloc[5, 3], "Latitude": latitude, "Longitude": longitude } df_2 = df_2.append(new_row, ignore_index=True) df_2 = df_2[['Year', 'Latitude', 'Longitude','Magnetic Declination','SourceFile']] df_2["Magnetic Declination"] = df_2["Magnetic Declination"].apply(lambda x: x.replace(" deg", "")) df_2.to_csv('magnetic_declination_australia.csv',index=False) df_3 = pd.concat([df_1,df_2], axis=0) df_3.to_csv('Magnetic_Declination_(USA+Australia).csv',index=False) else: # Case where endYear < 1985 and startYear > 1985 (probably an input error) print("Invalid Year. Please check the startYear & EndYear.") if __name__ == '__main__': start = time.time() args = parser.parse_args() latitude = args.latitude longitude = args.longitude startYear = int(args.startYear) endYear = int(args.endYear) verbose = args.verbose main(latitude,longitude,startYear,endYear,verbose) # Calling Main Function print("Processed time:", time.time() - start) # Total Time