首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AttributeError:'datetime.datetime‘对象没有属性’时间戳‘

AttributeError:'datetime.datetime‘对象没有属性’时间戳‘
EN

Stack Overflow用户
提问于 2018-06-01 20:36:57
回答 7查看 88.9K关注 0票数 25

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

目前正在运行Python2.0

我正试图利用Python的Plotly库来显示一个信息图表,说明比特币的价格。我尝试在代码顶部导入datetime,但这似乎解决不了问题。

代码语言:javascript
复制
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'

我的代码从这里开始,

代码语言:javascript
复制
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
EN

回答 7

Stack Overflow用户

发布于 2018-06-01 20:53:28

在Python3.3中添加了timestamp方法。因此,如果您正在使用Python2.0,甚至2.7,您就没有它。

当前的datetime版本在PyPI上有一些支持,但是似乎没有一个是官方的,或者是最新的;您可能想自己搜索一下。

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

你只需要将函数从3.3或更高版本的源代码中复制出来

代码语言:javascript
复制
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是一个具有tz感知的对象,它具有正确的UTC时区,除非您使用的是第三方库(如pytz ),否则2.x中就没有它。
  • _mktime方法和_tzinfo属性不存在于2.x datetime上,因此您需要模拟它们所做的事情。

如果您不需要相同的功能来同样好地工作在朴素、GMT和tz感知的日期时间,它不会那么难,但它仍然不是很简单-如果您确实需要完整的功能,这将是更痛苦的。

或者更容易移植医生们中给出的等效代码。

对于知道的datetime实例:

代码语言:javascript
复制
(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()

当然,您仍然没有那个timezone.utc,但是为此,您不需要一个完整的时区对象;您可以在文档中使用示例UTC类的一个实例。

…因为天真:

代码语言:javascript
复制
timestamp = dt.replace(tzinfo=timezone.utc).timestamp()

…或者:

代码语言:javascript
复制
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)

因为你不知道约会时间,所以你只需要最后一次约会。

如果您的Python已经足够老了,timedelta可能没有__div__方法。在这种情况下(如果您还没有找到一个后端端口),您还必须手动进行除法,方法是对每个端口调用total_seconds,确保其中至少一个是浮点数,然后除以数字:

代码语言:javascript
复制
timestamp = ((dt - datetime(1970, 1, 1)).total_seconds() / 
    float(timedelta(seconds=1).total_seconds()))

但是在这种情况下,很明显除数将是1.0,除以1.0等于什么都不做,所以:

代码语言:javascript
复制
timestamp = (dt - datetime(1970, 1, 1)).total_seconds()
票数 20
EN

Stack Overflow用户

发布于 2018-06-01 21:02:44

作为另一个应答状态,datetime.timestamp()是在Python3.3上添加的。

要在Python上获得类似的行为< 3.3,您需要使用time.mktime()

代码语言:javascript
复制
import time

def to_seconds(date):
    return time.mktime(date.timetuple())

然后,与其调用start_date.timestamp(),不如调用to_seconds(start_date)

票数 20
EN

Stack Overflow用户

发布于 2018-06-01 20:48:45

.timestamp()方法是在pythonVersion3.3 [来源]中添加的,因此您不能在Python2中使用.timestamp()

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50650704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档