【问题标题】:Script is fine, but will not run as imported module脚本很好,但不会作为导入的模块运行
【发布时间】:2015-11-13 14:07:32
【问题描述】:

使用此脚本/模块 XrateDKKUSD_test.py,我可以成功获取 DKK pr USD 的汇率。

import pandas as pd
import pandas.io.data as web
import datetime

def xRate_pd(years,modus,start=datetime.datetime(2000,1,1),end=pd.Timestamp.utcnow()):
    global xrate, xratedate, df_xrate

    days = int(252 * years)  # ant. arb. dage pr år = 252

    if modus == 'sim':
        start = datetime.datetime(2014,1,1)  # indstil manuelt
        end   = datetime.datetime(2015,5,18) # indstil manuelt

    if modus == 'trading':
        end   = pd.Timestamp.utcnow()
        start = end - days * pd.tseries.offsets.BDay()

    df_xrate = web.DataReader('DEXDNUS', 'fred',
                       start = start, end = end)
    print('df_xrate \n',df_xrate)

    # Selecting only last day from df, saving to xrate, xratedate
    xrate = df_xrate.ix[-1, 'DEXDNUS']
    xratedate = df_xrate.index[-1]

    return xrate, xratedate, df_xrate

if __name__ == '__main__':
#    xrate_lookup()
    xRate_pd(modus='trading',years=0.25)

但是,当我尝试使用此功能从我的主程序运行此脚本时...

def xRate(start, end, years, modus): 
    global xrate, xratedate, df_xrate

    xrate, xratedate, df_xrate = XRateDKKUSD_test.xRate_pd(start, end, modus) 

    return xrate, xratedate, df_xrate

使用此调用运行

import XRateDKKUSD_test
xRate_pd(start, end)

显然我已经在前面的函数中设置了“开始”和“结束”参数。

当脚本作为模块导入运行时,我突然遇到了这个脚本单独运行时没有得到的问题:

  File "z:/python/crystallball/git - crystalball/_crystalball_main.py", line 277, in <module>
    xRate_pd(start, end)

  File "Z:/python/CrystallBall/Git - CrystalBall/XRateDKKUSD.py", line 55, in xRate_pd
    days = int(252 * years)

TypeError: unsupported operand type(s) for *: 'int' and 'Timestamp'

有谁知道为什么会出现这种差异,以及在我导入和运行脚本时出错吗?

【问题讨论】:

    标签: python python-3.x pandas currency-exchange-rates


    【解决方案1】:

    您的脚本作为模块导入没有问题。您正在为 years 参数传入不同的类型对象。

    当您从 if __name__ == '__main__': 守卫调用代码时,您将 years 作为浮点数传入:

    xRate_pd(modus='trading', years=0.25)
    

    这对你的乘法很有效:

    days = int(252 * years)  # ant. arb. dage pr år = 252
    

    但是当你在导入后调用你的函数时,years 是从变量 start 中设置的:

    xRate_pd(start, end)
    

    并且start 不是float 而是Timestamp 实例,如错误消息所示:

    TypeError: unsupported operand type(s) for *: 'int' and 'Timestamp'
    

    这里的int252 字面量。

    【讨论】:

    • 好的-哇。当你说出来时,这是显而易见的。但是如何将时间戳转换为年浮动?我想我必须找到开始和结束之间的窗口持续时间。我不会吗?
    • @MortenE:这取决于你想做什么; TimeStamp 实例有一个 .year 属性,也许这就是你想要使用的?
    • 我会修改代码,所以我只使用时间戳。谢谢你的时间。很好的答案。
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 2021-12-24
    • 1970-01-01
    • 2013-09-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多