2016-01-27 2 views
0

Я пытаюсь определить эти две переменные, а затем использовать их снова в строке 6. Однако при запуске я получаю следующую ошибку. Кажется, это происходит только с pandas.date_range. Моя конечная цель - запустить это как .py-файл для создания диаграммы.вызов переменной внутри строки возвращает ValueError

start_date = raw_input('enter start date: ') 
end_date = raw_input('enter end date: ') 

dataPR['date'] = pd.DatetimeIndex(dataPR['intake_date']).date 
grouped_dataPR = dataPR.groupby(['date']).sum() 
idx = pd.date_range(start='%s', end='%s') % (start_date, end_date) 
grouped_dataPR.index = pd.DatetimeIndex(grouped_dataPR.index) 
grouped_dataPR = grouped_dataPR.reindex(idx, fill_value=0) 
grouped_dataPR['date'] = grouped_dataPR.index 
dataPR_df = pd.DataFrame([grouped_dataPR]) 
ts = pd.Series(grouped_dataPR['count'], index=grouped_dataPR.index) 
ts.plot() 
pd.rolling_mean(ts,30).plot(style='k') 

Ошибка:

ValueError        Traceback (most recent call   last) 
<ipython-input-33-2ac5fe9d8951> in <module>() 
    2 grouped_dataPR = dataPR.groupby(['date']).sum() 
    3 #idx = pd.date_range('%s', '%s' % (start_date, end_date)) 
----> 4 idx = pd.date_range(start='%s', end='%s') % (start_date,  end_date) 
     5 grouped_dataPR.index = pd.DatetimeIndex(grouped_dataPR.index) 
     6 grouped_dataPR = grouped_dataPR.reindex(idx, fill_value=0) 

/Users/abc/anaconda/lib/python2.7/site- packages/pandas/tseries/index.pyc in date_range(start, end, periods,  freq, tz, normalize, name, closed, **kwargs) 
    1921  return DatetimeIndex(start=start, end=end,  periods=periods, 
    1922       freq=freq, tz=tz,  normalize=normalize, name=name, 
-> 1923       closed=closed, **kwargs) 
    1924 
    1925 

/Users/abc/anaconda/lib/python2.7/site- packages/pandas/util/decorators.pyc in wrapper(*args, **kwargs) 
    87     else: 
    88      kwargs[new_arg_name] = new_arg_value 
---> 89    return func(*args, **kwargs) 
    90   return wrapper 
    91  return _deprecate_kwarg 

/Users/abc/anaconda/lib/python2.7/site- packages/pandas/tseries/index.pyc in __new__(cls, data, freq, start, end,  periods, copy, name, tz, verify_integrity, normalize, closed, ambiguous,  dtype, **kwargs) 
    235    return cls._generate(start, end, periods, name,  freq, 
    236         tz=tz, normalize=normalize,  closed=closed, 
--> 237         ambiguous=ambiguous) 
    238 
    239   if not isinstance(data, (np.ndarray, Index,  ABCSeries)): 

/Users/abc/anaconda/lib/python2.7/site- packages/pandas/tseries/index.pyc in _generate(cls, start, end, periods,  name, offset, tz, normalize, ambiguous, closed) 
    377 
    378   if start is not None: 
--> 379    start = Timestamp(start) 
    380 
    381   if end is not None: 

pandas/tslib.pyx in pandas.tslib.Timestamp.__new__  (pandas/tslib.c:8973)() 

pandas/tslib.pyx in pandas.tslib.convert_to_tsobject  (pandas/tslib.c:22522)() 

pandas/tslib.pyx in pandas.tslib.convert_str_to_tsobject  (pandas/tslib.c:24520)() 

ValueError: 
+0

Какие входы вы используете? Например. что такое 'start_date' и' end_date'? Какой формат нужен «Timestamp»? –

+0

'%' - строковый оператор; вы не можете использовать его с произвольным блоком синтаксиса. – chepner

ответ

3

Я думаю, вам просто нужно сделать

pd.date_range(start=start_date, end=end_date) 

Причина в том, что pandas.data_range ожидает string or datetime-like объект для обоих параметров start и end. '%s' не похож на datetime.

Если это был действительный параметр, то код, который вы написали, пытается выполнить операцию modulo между pandas date_range и кортежем строк, что более чем вероятно вызывает другую ошибку.


Если же нужно использовать строку форматирования для этих значений, я бы предложил использовать новый способ форматирования строк, как

pd.date_range(start='{}'.format(start_date), end='{}'.format(end_date)) 
+0

«ValueError» возникает, когда что-то в Pandas, наконец, пытается использовать литеральные строки '% s', которые' date_range' получает в качестве аргументов. Python даже не пытается оценить оператор '%'. – chepner

+0

@chepner - имеет смысл, будет обновлять сообщение –

+0

это работает! - большое вам спасибо за вашу помощь. Не могу поверить, что я этого не пробовал. – ik629

4

Вы должны вызывать переменные непосредственно, без упаковки их в кавычки. Вы пытаетесь сделать замену строк смешным способом, который не будет работать.

idx = pd.date_range(start=start_date, end=end_date) 

Если по каким-то причинам вы все еще хотите сделать строку замены, вы должны сделать это так, заменяя каждую строку по отдельности:

idx = pd.date_range(start='%s' % (start_date,), end='%s' % (end_date,)) 
+0

также правильно, большое спасибо за ваш ответ! – ik629

Смежные вопросы