请帮助 - 我一直收到以下回溯错误:
目前正在运行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'
Run Code Online (Sandbox Code Playgroud)
我的代码从这里开始
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¤cyPair={}&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
Run Code Online (Sandbox Code Playgroud)
Mat*_*ero 14
正如其他答案所述,datetime.timestamp()已添加到Python 3.3。
要在 Python < 3.3 上获得类似的行为,您需要使用time.mktime():
import time
def to_seconds(date):
return time.mktime(date.timetuple())
Run Code Online (Sandbox Code Playgroud)
然后,而不是调用start_date.timestamp(),您只需调用to_seconds(start_date)
该timestamp方法是在Python 3.3中添加的。因此,如果您使用的是Python 2.0或2.7,则没有它。
datetime在PyPI上有当前到较旧的Python版本的支持,但似乎没有一个是官方的或最新的。您可能要尝试搜索自己。
还有许多第三方替换库添加了(2.x)中不datetime包含的功能,包括能够转换为Unix时间戳的功能。
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()
Run Code Online (Sandbox Code Playgroud)
…但是您将需要做一些修改才能使它们正常工作,因为:
_EPOCH 在模块末尾被删除。_EPOCH是可感知tz的对象,具有正确的UTC时区,在2.x中没有,除非您使用的是第三方库,例如pytz。_mktime方法和_tzinfo属性上不存在2.X datetime,所以你需要模拟他们做了什么为好。如果您不需要相同的功能在天真,GMT和可感知tz的日期时间上均能正常工作,就不会那么困难,但这仍然不是一件容易的事-如果您确实需要完整的功能,那就可以了更加痛苦。
或者移植文档中给出的等效代码可能会更容易。
对于已知datetime实例:
(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
Run Code Online (Sandbox Code Playgroud)
当然,您仍然没有该对象timezone.utc,但为此,您不需要完整的时区对象。您可以UTC在2.x tzinfodocs中使用example 类的实例。
……天真:
timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
Run Code Online (Sandbox Code Playgroud)
… 要么:
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
Run Code Online (Sandbox Code Playgroud)
由于您不知道日期时间,因此只需要最后一个。
如果您的Python足够老,则timedelta可能没有__div__方法。在这种情况下(如果您还没有找到反向端口),您还必须手动进行除法,方法是调用total_seconds每一个,确保其中至少一个是浮点数,然后除以数字:
timestamp = ((dt - datetime(1970, 1, 1)).total_seconds() /
float(timedelta(seconds=1).total_seconds()))
Run Code Online (Sandbox Code Playgroud)
但是在这种情况下,很明显除数将是1.0,除以1.0等于什么都不做,所以:
timestamp = (dt - datetime(1970, 1, 1)).total_seconds()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21517 次 |
| 最近记录: |