AttributeError:'datetime.datetime'对象没有属性'timestamp'

时间:2018-06-01 20:36:58

标签: python

请帮助 - 我一直收到以下追踪错误:

目前正在运行Python 2.0

我正在尝试利用Python的Plotly库来显示一个说明比特币价格的信息图。我已尝试在我的代码顶部导入日期时间,但这似乎无法解决问题。

Traceback (most recent call last):
  File "project_one.py", line 165, in <module>
    crypto_price_df = get_crypto_data(coinpair)
  File "project_one.py", line 155, in get_crypto_data
    json_url = base_polo_url.format(poloniex_pair, start_date.timestamp(), end_date.timestamp(), pediod)
AttributeError: 'datetime.datetime' object has no attribute 'timestamp'

我的代码从这里开始

import numpy as np
import pandas as pd
from pandas import Series, DataFrame, Panel
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
import seaborn as sns
import sklearn as sk
import scipy as sp
import os
import pickle
import quandl
import datetime
import plotly.plotly as py
import plotly.graph_objs as go
import plotly.figure_factory as ff
from plotly import tools
from plotly.offline import iplot, init_notebook_mode
from IPython.display import display, HTML
init_notebook_mode(connected=True)


def get_quandl_data(quandl_id):

    cache_path = '{}.pkl'.format(quandl_id).replace('/','-')
    try:
        f = open(cache_path, 'rb')
        df = pickle.load(f)   
        print('Loaded {} from cache'.format(quandl_id))
    except (OSError, IOError) as e:
        print('Downloading {} from Quandl'.format(quandl_id))
        df = quandl.get(quandl_id, returns="pandas")
        df.to_pickle(cache_path)
        print('Cached {} at {}'.format(quandl_id, cache_path))
    return df


btc_usd_price_kraken = get_quandl_data('BCHARTS/KRAKENUSD')



exchanges = ['COINBASE','BITSTAMP','ITBIT']

exchange_data = {}

exchange_data['KRAKEN'] = btc_usd_price_kraken

for exchange in exchanges:
    exchange_code = 'BCHARTS/{}USD'.format(exchange)
    btc_exchange_df = get_quandl_data(exchange_code)
    exchange_data[exchange] = btc_exchange_df

def merge_dfs_on_column(dataframes, labels, col):

    series_dict = {}
    for index in range(len(dataframes)):
        series_dict[labels[index]] = dataframes[index][col]

    return pd.DataFrame(series_dict) 


btc_usd_datasets = merge_dfs_on_column(list(exchange_data.values()), 
list(exchange_data.keys()), 'Weighted Price')



def df_scatter(df, title, seperate_y_axis=False, y_axis_label='', 
scale='linear', initial_hide=False):

    label_arr = list(df)
    series_arr = list(map(lambda col: df[col], label_arr))

    layout = go.Layout(
        title=title,
        legend=dict(orientation="h"),
        xaxis=dict(type='date'),
        yaxis=dict(
            title=y_axis_label,
            showticklabels= not seperate_y_axis,
            type=scale
        )
    )

    y_axis_config = dict(
        overlaying='y',
        showticklabels=False,
        type=scale )

    visibility = 'visible'
    if initial_hide:
        visibility = 'legendonly'


    trace_arr = []
    for index, series in enumerate(series_arr):
        trace = go.Scatter(
            x=series.index, 
            y=series, 
            name=label_arr[index],
            visible=visibility
        )


        if seperate_y_axis:
            trace['yaxis'] = 'y{}'.format(index + 1)
            layout['yaxis{}'.format(index + 1)] = y_axis_config    
        trace_arr.append(trace)

    fig = go.Figure(data=trace_arr, layout=layout)
    py.plot(fig)



df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')


btc_usd_datasets.replace(0, np.nan, inplace=True)


df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')


btc_usd_datasets['avg_btc_price_usd'] = btc_usd_datasets.mean(axis=1)



btc_trace = go.Scatter(x=btc_usd_datasets.index, 
y=btc_usd_datasets['avg_btc_price_usd'])
py.plot([btc_trace])



def get_json_data(json_url, cache_path):

    try:        
        f = open(cache_path, 'rb')
        df = pickle.load(f)   
        print('Loaded {} from cache'.format(json_url))
    except (OSError, IOError) as e:
        print('Downloading {}'.format(json_url))
        df = pd.read_json(json_url)
        df.to_pickle(cache_path)
        print('Cached {} at {}'.format(json_url, cache_path))
    return df

# Helper Function that Generates Poloniex API HTTP requests
base_polo_url = 'https://poloniex.com/public? 
command=returnChartData&currencyPair={}&start={}&end={}&period={}'
start_date = datetime.datetime.strptime('2015-01-01', '%Y-%m-%d') # get 
data from the start of 2015
end_date = datetime.datetime.now() # up until today
pediod = 86400 # pull daily data (86,400 seconds per day)

def get_crypto_data(poloniex_pair):

    json_url = base_polo_url.format(poloniex_pair, start_date.timestamp(), end_date.timestamp(), pediod)
    data_df = get_json_data(json_url, poloniex_pair)
    data_df = data_df.set_index('date') 
    return data_df


altcoins = ['ETH','LTC','XRP','ETC','STR','DASH','SC','XMR','XEM']
altcoin_data = {}
for altcoin in altcoins:
    coinpair = 'BTC_{}'.format(altcoin)
    crypto_price_df = get_crypto_data(coinpair)
    altcoin_data[altcoin] = crypto_price_df

7 个答案:

答案 0 :(得分:6)

在Python 3.3中添加了timestamp方法。因此,如果您使用的是Python 2.0,甚至是2.7,那么您就没有它。

PyPI上有旧的Python版本的当前datetime的后向端口,但它们似乎都不是官方的,也不是最新的;你可能想尝试自己寻找。

还有许多第三方替换库添加了不在(2.x)datetime中的功能,包括转换为Unix时间戳的功能。

你可以copy the function out of the source code from 3.3 or later

def timestamp(self):
    "Return POSIX timestamp as float"
    if self._tzinfo is None:
        s = self._mktime()
        return s + self.microsecond / 1e6
    else:
        return (self - _EPOCH).total_seconds()

...但你必须稍微修改一下才能让它们起作用,因为:

  • _EPOCH将在模块末尾删除。
  • 3.x _EPOCH是一个使用正确的UTC时区构建的tz感知对象,除非您使用的是{{1}之类的第三方库,否则您在2.x中没有该时区}。
  • 2.x pytz上不存在_mktime方法和_tzinfo属性,因此您需要模拟它们的作用。

如果你不需要同样的功能同样适用于天真,GMT和tz感知的日期时间,它就不会那么难,但它仍然不是很简单 - 如果你确实需要完整的功能,这会更痛苦。

或者,移植the docs中给出的等效代码可能更容易。

对于感知datetime个实例:

datetime

当然你还没有那个(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds() ,但为了这个目的,你不需要一个完整的时区对象;您可以在2.x tzinfo docs中使用示例timezone.utc类的实例。

...对于天真:

UTC

......或:

timestamp = dt.replace(tzinfo=timezone.utc).timestamp()

由于你没有意识到日期时间,所以你需要的是最后一个。

如果您的Python足够大,timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1) 可能没有timedelta方法。在这种情况下(如果你还没有找到一个backport),你也必须手动进行除法,在每一个上调用__div__,确保它们中至少有一个是浮点数,并除以数字:

total_seconds

但在这种特殊情况下,显然除数只是1.0,除以1.0与无效相同,所以:

timestamp = ((dt - datetime(1970, 1, 1)).total_seconds() / 
    float(timedelta(seconds=1).total_seconds()))

答案 1 :(得分:3)

正如其他答案所述, Python 3.3 上添加了time.mktime()

在Python上获得类似的行为&lt; 3.3,您需要使用import time def to_seconds(date): return time.mktime(date.timetuple())

start_date.timestamp()

然后,您只需致电to_seconds(start_date)

,而不是致电mygcd a b = until (==0) (`mod` (a b)) b

答案 2 :(得分:0)

.timestamp()方法已添加到python版本3.3 [source]中,因此您无法在Python 2中使用.timestamp()

答案 3 :(得分:0)

理解易于使用的独立版本如下:

import datetime
import sys
if sys.version_info[0] < 3 or sys.version_info[1] < 4:
    # python version < 3.3
    import time
    def timestamp(date):
        return time.mktime(date.timetuple())
else:
    def timestamp(date):
        return date.timestamp()

# Example usecase:
date = datetime.datetime.strptime('2015-01-01', '%Y-%m-%d')
print(timestamp(date))

答案 4 :(得分:0)

这是一个非常简单的解决方案: 在进一步移动之前,请确保您已安装 Python 3.3 或更高版本。 您可以像这样替换运行命令。 在使用命令运行 python 脚本之前:

python <your_script_name.py>

像这样替换这个命令:

python3 <your_script_name.py>

希望这能解决您的问题。

答案 5 :(得分:0)

如果要计算到微秒/纳秒,则必须执行以下操作..

import time
from datetime import datetime

timestamp_str = '2021.01.21 11:11:52:238'
dt_obj = datetime.strptime(timestamp_str, '%Y.%m.%d %H:%M:%S:%f')
timestamp = time.mktime(dt_obj.timetuple()) + dt_obj.microsecond / 1e6
timestamp_ns = int(timestamp * 1000000000)
print(timestamp_ns)

答案 6 :(得分:-1)

在Python 2.x中,您需要使用的是time()模块中的方法time,如下所示:

>>> from time import time
>>> time()
1535495731.95094

它将为您提供与来自Python 3.x的timestamp()对象的datetime方法相同的功能:

>>> from datetime import datetime
>>> datetime.now().timestamp()
1535495993.949849

但这仅在您需要当前时间戳记而不是任何时间戳记时有效。

官方文档:https://docs.python.org/2/library/time.html#time.time