данные о времени импорта отдельно от даты и без добавленных дат - PullRequest
0 голосов
/ 14 декабря 2018

При импорте типового файла данных запаса с внутридневным интервалом в 1 минуту:

data7 = pd.read_csv('Documents/spy1min.txt', parse_dates=[0], index_col=[0, 1], usecols=['Date','Time','Open','High','Low','Close'])

Фрейм данных результата выглядит следующим образом:

                  Open    High     Low   Close
Date       Time                                 
2016-12-14 08:01  227.80  227.91  227.76  227.77
           08:02  227.78  227.78  227.77  227.77
           08:03  227.77  227.77  227.77  227.77
           08:04  227.76  227.76  227.76  227.76

Тем не менее, часть индекса «Время»теперь является строкой, а не распознается как время.

Если я вместо этого установлю parse_dates = [1] в приведенном выше коде, я получу

                            Open    High     Low   Close
Date       Time                                               
12/14/2016 2018-12-14 08:01:00  227.80  227.91  227.76  227.77
           2018-12-14 08:02:00  227.78  227.78  227.77  227.77
           2018-12-14 08:03:00  227.77  227.77  227.77  227.77

Ни один из вариантов не идеален: я не хочу, чтобы сегодняшняя дата произвольно добавлялась в «Время»,но я хочу, чтобы время отображалось в реальном времени, а не в строках.Есть ли способ сделать это кратко в Python?Большое спасибо!

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

1 Ответ

0 голосов
/ 14 декабря 2018

Таким образом, вы можете создать столбец времени и добавить к индексу set_index или преобразовать time s в timedeltas на to_timedelta:

import pandas as pd

temp=u"""Date,Time,Open,High,Low,Close
2016-12-14,08:01,227.80,227.91,227.76,227.77
2016-12-14,08:02,227.78,227.78,227.77,227.77
2016-12-14,08:03,227.77,227.77,227.77,227.77
2016-12-14,08:04,227.76,227.76,227.76,227.76"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), 
                 index_col=[0], 
                 parse_dates=[0],
                 usecols=['Date','Time','Open','High','Low','Close'])

print (df)
             Time    Open    High     Low   Close
Date                                             
2016-12-14  08:01  227.80  227.91  227.76  227.77
2016-12-14  08:02  227.78  227.78  227.77  227.77
2016-12-14  08:03  227.77  227.77  227.77  227.77
2016-12-14  08:04  227.76  227.76  227.76  227.76

df['Time'] = pd.to_datetime(df['Time']).dt.time
df = df.set_index('Time', append=True)
print (df)
                       Open    High     Low   Close
Date       Time                                    
2016-12-14 08:01:00  227.80  227.91  227.76  227.77
           08:02:00  227.78  227.78  227.77  227.77
           08:03:00  227.77  227.77  227.77  227.77
           08:04:00  227.76  227.76  227.76  227.76

print (df.index.get_level_values(1))
Index([08:01:00, 08:02:00, 08:03:00, 08:04:00], dtype='object', name='Time')

print (type(df.index.get_level_values(1)[0]))
<class 'datetime.time'>

df['Time'] = pd.to_timedelta(df['Time'] + ':00')
df = df.set_index('Time', append=True)
print (df)
                       Open    High     Low   Close
Date       Time                                    
2016-12-14 08:01:00  227.80  227.91  227.76  227.77
           08:02:00  227.78  227.78  227.77  227.77
           08:03:00  227.77  227.77  227.77  227.77
           08:04:00  227.76  227.76  227.76  227.76

print (df.index.get_level_values(1))
TimedeltaIndex(['08:01:00', '08:02:00', '08:03:00', '08:04:00'],
               dtype='timedelta64[ns]', name='Time', freq=None)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...