与日期分开导入时间数据且不添加日期

import time data separately from date and without added dates

导入典型的日内 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

但是,索引的 'Time' 部分现在是一个字符串,而不是被识别为时间。

如果我在上面的代码中设置 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

这两个选项都不理想:我不想将今天的日期任意添加到 'Time',但我希望 'Time' 表示为实时而不是字符串。在 python 中有没有办法简洁地做到这一点?非常感谢!

(p.s。我知道我可以将 'Date' 和 'Time' 组合成一个 DateTimeindex。但是在我后来的处理中,保留 [=28= 有很多优点] 和 'Time' 分离和分层:例如,我经常需要 运行 在所有不同日期分析相同的时间间隔。)

因此您可以创建时间列并通过 set_index 追加到索引或通过 to_timedelta:

times 转换为 timedeltas
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)