在pandas中分析csv中的datetime不产生DateTimeIndex

2024-04-25 17:50:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我在探索熊猫——试着学习和应用它。目前,我有一个csv文件,其中填充了以下结构的金融时间序列数据:

date, time, open, high, low, close, volume 2003.04.08,12:00,1.06830,1.06960,1.06670,1.06690,446 2003.04.08,13:00,1.06700,1.06810,1.06570,1.06630,433 2003.04.08,14:00,1.06650,1.06810,1.06510,1.06670,473 2003.04.08,15:00,1.06670,1.06890,1.06630,1.06850,556 2003.04.08,16:00,1.06840,1.07050,1.06610,1.06680,615

现在我想把csv数据转换成pandas数据帧对象,这样日期和时间字段合并成数据帧的DateTimeIndex,如下所示:

df = pa.read_csv(path,
                 names = ['date', 'time', 'open', 'high', 'low', 'close', 'vol'],
                 parse_dates = {'dateTime': ['date', 'time']},  
                 index_col = 'dateTime')

这可以产生一个很好的DataFrame对象:

<class 'pandas.core.frame.DataFrame'>
Index: 8676 entries, 2003.04.08 12:00 to nan nan
Data columns (total 5 columns):
open     8675  non-null values
high     8675  non-null values
low      8675  non-null values
close    8675  non-null values
vol      8675  non-null values
dtypes: float64(5)

但经检查发现,索引不是DataTimeIndex,而是unicode字符串:

type(df.index)
>>> pandas.core.index.Index
df.index
>>> Index([u'2003.04.08 12:00', u'2003.04.08 13:00', u'2003.04.08 14:00', ....

所以read_csv分析了日期和时间字段,合并了它们,但没有创建日期时间索引。根据我对documentation的理解,一个新的datastructure对象应该会自动创建一个DateTimeIndex。我错了吗?DataFrame对象是一个异常吗?

我还尝试转换当前索引,如下所示:

df.index = pa.to_datetime(df.index)

但是索引没有改变,仍然是unicode格式。我开始怀疑默认的解析函数没有完成它们的工作,但是我没有从它们那里得到任何错误消息。

在这种情况下,如何在日期框架中获取工作日期时间索引?

解决方案:

df = pa.read_csv(path,
                 names = ['date', 'time', 'open', 'high', 'low', 'close', 'vol'],
                 parse_dates={'datetime':['date','time']},
                 keep_date_col = True, 
                 index_col='datetime'
             )

现在应用lambda函数,执行解析器应该执行的操作:

df['datetime'] = df.apply(lambda row: datetime.datetime.strptime(row['date']+ ':' + row['time'], '%Y.%m.%d:%H:%M'), axis=1)

Tags: csv数据dfclosedatetimedateindextime
1条回答
网友
1楼 · 发布于 2024-04-25 17:50:15

Dateutil无法正确分析数据,但可以在加载后使用strptime这样做:

import datetime
df['DateTime'] = df.apply(lambda row: datetime.datetime.strptime(row['date']+ ':' + row['time'], '%Y.%m.%d:%H:%M'), axis=1)

这将产生“DateTime”列作为datetime64[ns],您可以使用它作为索引

编辑

嗯。。有趣的是,当我这样做的时候,它是有效的:

df = pd.read_csv(r'c:\data\temp.txt', parse_dates={'datetime':['date','time']}, index_col='datetime')

你能看看当你把列名从参数中删除到read_csv时会发生什么吗

相关问题 更多 >