This is a currency converter that uses historical rates against a reference currency (Euro).

The default source is the European Central Bank . This is the ECB historical rates for 42 currencies against the Euro since 1999. It can be downloaded here: eurofxref-hist.zip . The converter can use different sources as long as the format is the same.

Or use the Python package:

You can install directly after cloning:

After installation, you should have currency_converter in your $PATH :

Python API

Create once the currency converter object:

>>> from currency_converter import CurrencyConverter >>> c = CurrencyConverter ()

Convert from EUR to USD using the last available rate:

>>> c . convert ( 100 , 'EUR' , 'USD' ) # doctest: +SKIP 137.5 ...

Default target currency is EUR :

>>> c . convert ( 100 , 'EUR' ) 100.0 >>> c . convert ( 100 , 'USD' ) # doctest: +SKIP 72.67 ...

You can change the date of the rate:

>>> from datetime import date # datetime works too >>> c . convert ( 100 , 'EUR' , 'USD' , date = date ( 2013 , 3 , 21 )) 129. ..

Fallbacks Some rates are missing: >>> c . convert ( 100 , 'BGN' , date = date ( 2010 , 11 , 21 )) Traceback ( most recent call last ): RateNotFoundError : BGN has no rate for 2010 - 11 - 21 But we have a fallback mode for those, using a linear interpolation of the closest known rates, as long as you ask for a date within the currency date bounds: >>> c = CurrencyConverter ( fallback_on_missing_rate = True ) >>> c . convert ( 100 , 'BGN' , date = date ( 2010 , 11 , 21 )) 51.12 ... The fallback method can be configured with the fallback_on_missing_rate_method parameter, which currently supports "linear_interpolation" and "last_known" values. We also have a fallback mode for dates outside the currency bounds: >>> c = CurrencyConverter () >>> c . convert ( 100 , 'EUR' , 'USD' , date = date ( 1986 , 2 , 2 )) Traceback ( most recent call last ): RateNotFoundError : 1986 - 02 - 02 not in USD bounds 1999 - 01 - 04 / 2016 - 04 - 29 >>> >>> c = CurrencyConverter ( fallback_on_wrong_date = True ) >>> c . convert ( 100 , 'EUR' , 'USD' , date = date ( 1986 , 2 , 2 )) # fallback to 1999-01-04 117.89 ...

Other attributes bounds lets you know the first and last available date for each currency >>> first_date , last_date = c . bounds [ 'USD' ] >>> first_date datetime . date ( 1999 , 1 , 4 ) >>> last_date # doctest: +SKIP datetime . date ( 2016 , 11 , 14 ) currencies is a set containing all available currencies >>> c . currencies # doctest: +SKIP set ([ 'SGD' , 'CAD' , 'SEK' , 'GBP' , ... >>> 'AAA' in c . currencies False >>> c . convert ( 100 , 'AAA' ) Traceback ( most recent call last ): ValueError : AAA is not a supported currency Finally, you can use your own currency file, as long as it has the same format (ECB): # Load the packaged data (might not be up to date) c = CurrencyConverter () # Load the up to date full history c = CurrencyConverter ( 'http://www.ecb.int/stats/eurofxref/eurofxref-hist.zip' ) # Load only the latest rates (single day data source) c = CurrencyConverter ( 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref.zip' ) # Load your custom file c = CurrencyConverter ( './path/to/currency/file.csv' )