我有一个熊猫数据框如下:
>>> 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()
函数中使用。我不知道如何在不提取我的信息和使用列表的情况下解决这个问题,我真的不想这样做。
有什么想法吗?
感谢您的帮助。
答案 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