python pandas:访问datetime系列进行货币转换

时间:2017-03-22 19:38:37

标签: python pandas datetime

我有一个熊猫数据框如下:

>>> df.head()
            Date         From        To        Currency    Net
TransID
4569219     2015-02-21   Calzada     Michael   MXN         2396.0
5630763     2013-08-18   Juan        Edgar     USD         155.56
4698552     2013-08-17   David       Jessica   MXN         1965.23
5706840     2013-08-11   Edgar       Luis      MXN         923.22
7522850     2011-08-11   Jonathan    Juan      USD         58.23

Date系列为dtype: datetime64[ns]Net系列为dtype: float64

我想根据指定日期的汇率将任何墨西哥比索(MXN)金额兑换成美元。

为此,我使用forex_python库,例如:

>>> from forex_python.converter import CurrencyRates
... from datetime import datetime
...
... c = CurrencyRates()
... amount = 1000
... date = datetime(2013,02,21)
... print c.convert('MXN','USD', amount, date)
78.344

这会转换1000 MXN并以美元返回金额。现在我想将它应用于我的数据帧,但我得到了不同类型的错误。首先,我尝试过:

from forex_python.converter import CurrencyRates
from datetime import datetime

c = CurrencyRates()
df.loc[df['Currency'].str.contains('MXN'), 'Net'] = c.convert('MXN', 'USD', df['Net'], df['Dates'])

但我明白了:

AttributeError: 'Series' object has no attribute 'strftime'

在此处搜索错误后,我尝试了使用dt访问者的另一种方法:

from forex_python.converter import CurrencyRates
from datetime import datetime

c = CurrencyRates()
df.loc[df['Currency'].str.contains('MXN'), 'Net'] = c.convert('MXN', 'USD', df['Net'], datetime(df['Date'].dt.year, df['Date'].dt.month, df['Date'].dt.day))

这次我收到另一个错误:

TypeError: cannot convert the series to <type 'int'>

我应该强调,如果我没有使用日期参数(但我今天获得的汇率),它的工作正常。即:

df.loc[df['Currency'].str.contains('MXN'), 'Net'] = c.convert('MXN', 'USD', df['Net'])
df['Currency'] = 'USD'

我希望我的最终结果是:

>>> df.head()
            Date         From        To        Currency    Net
TransID
4569219     2015-02-21   Calzada     Michael   USD         158.68
5630763     2013-08-18   Juan        Edgar     USD         155.56
4698552     2013-08-17   David       Jessica   USD         154.40
5706840     2013-08-11   Edgar       Luis      USD         923.22
7522850     2011-08-11   Jonathan    Juan      USD         72.53

我无法从Date系列中提取相应的日期,以便在我的c.convert()函数中使用。我不知道如何在不提取我的信息和使用列表的情况下解决这个问题,我真的不想这样做。

有什么想法吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这是apply的一个很好的用例,它可以使用axis=1循环遍历所有行。

df['Date'] = pd.to_datetime(df.Date)
df['Net'] = df.apply(lambda x: x.Net if x.Currency == 'USD' else 
                               c.convert('MXN', 'USD', x.Net, x.Date), axis=1)
df['Currency'] = 'USD'

              Date      From       To Currency         Net
TransID                                                   
4569219 2015-02-21   Calzada  Michael      USD  159.638292
5630763 2013-08-18      Juan    Edgar      USD  155.560000
4698552 2013-08-17     David  Jessica      USD  152.944025
5706840 2013-08-11     Edgar     Luis      USD   73.240889
7522850 2011-08-11  Jonathan     Juan      USD   58.230000