Ошибка Python: невозможно добавить интегральное значение к метке времени без частоты

Я пытаюсь вычислить разницу между двумя датами, чтобы получить число, представляющее собой целочисленную разницу (в днях) между двумя датами, но получаю следующую ошибку: «Невозможно добавить интегральное значение в Timestmp без freq». Вот код:

from __future__ import print_function

try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None

import os
import datetime
import pandas_datareader.data as web
import numpy as np
import pandas as pd

def main():
    count = 0
    df = pd.DataFrame([])
    start = datetime.datetime(2017, 10, 11)
    end = datetime.datetime(2017, 10, 27)
    index_date = datetime.datetime(2017, 10, 11)
    symbols_list = ['ORCL', 'TSLA', 'IBM','YELP', 'MSFT']
    length = len(symbols_list)
    for num, ticker in enumerate(symbols_list, start=1):
        f = web.DataReader(ticker, 'yahoo', start, end)['Adj Close']
        f.ix[index_date]
        if count == 0:
            f = f.to_frame().reset_index()
            df = f
            df.columns = ['Date', ticker]
            length_df = len(df)
            sDate = df.iloc[:,-2]  # Date data list
            print ('sDate[0] is: ', (sDate[0]))
            j = 0
            while j < len(sDate[j] - 1):
                date_delta = timedelta(sDate[j] - index_date)
                j += 1

Вылетает на последней строке:

date_delta = timedelta(sDate[j] - index_reference_date)

Сообщение об ошибке: «Невозможно добавить интегральное значение в Timestmp без freq».

Я не могу понять, в чем проблема. Типы данных:

sDate[0] is:     2017-10-06 00:00:00, and 
index_date is:   2017-10-11 00:00:00 
index_date type is:  <type 'datetime.datetime'>

Но учтите, что:

sDate[0] type is:  <class 'pandas._libs.tslib.Timestamp'>

Итак: Может проблема здесь? Спасибо за любую помощь!


person Chas    schedule 07.11.2017    source источник


Ответы (2)


В этой строке опечатка:

while j < len(sDate[j] - 1):

sDate - это список данных даты, поэтому sDate[j] - это дата (вероятно, типа pandas.tslib.Timestamp), и ее длина не имеет смысла. Итак, вы, вероятно, хотите что-то вроде:

while j < len(sDate) - 1:

Возможно, более уместно использовать цикл for, например:

for dat in sDate[:-1]:

Изменить: и тогда вам нужны мысли, которые я написал в первом ответе.

person xhancar    schedule 07.11.2017
comment
Я внес предложенные изменения и получил: j = 0, в то время как j ‹ len(sDate - 1): date_delta = timedelta(микросекунды=(sDate[j] - index_reference_date).delta) j += 1 Ошибка: несовместимый тип для datetime/ операция timedelta [sub] - person Chas; 07.11.2017
comment
Читай внимательно мой друг. len(sDate) - 1 (о чем я и написал) не совпадает с len(sDate - 1) из вашего комментария. - person xhancar; 08.11.2017

Важным может быть тип разницы sDate[j] - index_reference_date и то, как передать ее конструктору timedelta.

Я считаю, что это может быть решением:

date_delta = timedelta(microseconds=(sDate[j] - index_reference_date).delta)
person xhancar    schedule 07.11.2017
comment
Ну, это выдает эту ошибку: ValueError: Невозможно добавить целочисленное значение к метке времени без частоты. - person Chas; 07.11.2017