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

标签 python pandas datetime time-series import-from-csv

导入典型的日内 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 中简洁地做到这一点?非常感谢!

(p.s.我知道我可以将“Date”和“Time”组合成一个DateTimeindex。但是在我以后的处理中,保持“Date”和“Time”分离和分层有很多好处:例如,我通常需要在所有不同的日期运行相同的时间间隔分析。)

最佳答案

因此,您可以创建时间列并通过 set_index 附加到索引,或通过 to_timedeltatime 转换为 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)

关于python - 与日期分开导入时间数据并且不添加日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53778650/

相关文章:

Pandas,应用 groupby 值创建新列

python - Azure Python 函数日期时间表达式

javascript 日期时间到字符串并返回日期时间?

python - 在 PySpark 中将 Spark DataFrame 从行转换为列,并将其附加到另一个 DataFrame

python - 使用非均匀毫秒盘中数据同步和重采样两个时间序列

python - 在 Python 中设置分区

python - 外部合并后保留 Dataframe 列数据类型

python - 如何在Python中合并两个pandas DataFrame?

php - 我应该如何过滤 MySQL 中的日期?

python - 如何使用 bool 掩码在 pandas DataFrame 中用 nan 替换 'any strings'?