python - 从 pandas 中的 csv 解析日期时间不会产生 DateTimeIndex

标签 python csv pandas

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

日期、时间、开盘价、最高价、最低价、收盘价、交易量 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 DataFrame 对象,以便日期和时间字段合并并成为 DataFrame 的 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 解析了日期和时间字段,合并它们但没有创建 DateTimeIndex。据我了解 documentation与日期时间对象列表一起提供的新数据结构对象应自动创建 DateTimeIndex。我错了吗? DataFrame 对象是否异常?

我也试过像这样转换当前索引:

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

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

在这种情况下,如何在 DateFrame 中获取有效的 DateTimeIndex?

解决方案:

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)

最佳答案

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

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

这将为您生成作为 datetime64[ns] 的“DateTime”列,您可以将其用作索引

编辑

嗯..有趣的是,当我这样做时它起作用了:

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

当您将列名从参数中删除到 read_csv 时,您能看到会发生什么吗?

关于python - 从 pandas 中的 csv 解析日期时间不会产生 DateTimeIndex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19590659/

相关文章:

python - 如何使用正则表达式在 python 中正确替换

python - 使用 ODO python 包将 CSV 加载到 MySQL 表中 - 日期错误 1292

python - 将 CSV 数据读取为标题和值对

pandas - 无法在seaborn中创建对角直方图

python - Pandas 重复 groupby

python - 如何移动 pandas DataFrame 中的多行?

复数指数的 Python 与 R/Matlab 实现

Python - 将文件拖入 .exe 以运行脚本

python - 尝试将 CSV 转换为数据帧时出现 IOError

python - 随机分配 pandas DataFrame 功能