与日期分开导入时间数据且不添加日期
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
:
将 time
s 转换为 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)
导入典型的日内 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
:
time
s 转换为 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)