26

我有一个与 csv 文件和解析日期时间相关的简单问题。

我有一个如下所示的 csv 文件:

YYYYMMDD, HH,    X
20110101,  1,   10
20110101,  2,   20
20110101,  3,   30

我想使用 pandas (read_csv) 阅读它,并将它放在由日期时间索引的数据框中。到目前为止,我已经尝试实现以下内容:

import pandas as pnd
pnd.read_csv("..\\file.csv",  parse_dates = True, index_col = [0,1])

我得到的结果是:

                         X
YYYYMMDD    HH            
2011-01-01 2012-07-01   10
           2012-07-02   20
           2012-07-03   30

正如您在将 HH 转换为不同日期时看到的 parse_dates 一样。

是否有一种简单有效的方法可以将“YYYYMMDD”列与“HH”列正确组合以获得类似的东西?:

                      X
Datetime              
2011-01-01 01:00:00  10
2011-01-01 02:00:00  20
2011-01-01 03:00:00  30

在此先感谢您的帮助。

4

2 回答 2

32

如果将列表传递给index_col,则意味着您要从列表中的列中创建层次索引。

此外,parse_dates关键字可以设置为 True 或列表/字典。如果为 True,则它会尝试将各个列解析为日期,否则它将组合列以解析单个日期列。

总之,你想要做的是:

from datetime import datetime
import pandas as pd
parse = lambda x: datetime.strptime(x, '%Y%m%d %H')
pd.read_csv("..\\file.csv",  parse_dates = [['YYYYMMDD', 'HH']], 
            index_col = 0, 
            date_parser=parse)
于 2012-07-23T17:45:03.773 回答
11

我一直在这样做,所以我测试了不同的速度方法。我发现最快的是以下,大约。在考虑文件解析和日期解析的总时间时,至少在我的情况下,比 Chang She 的解决方案快 3 倍:

首先,使用不解析日期的 pd.read_csv 解析数据文件。我发现它大大减慢了文件读取速度。确保 CSV 文件的列现在是数据框 df 中的列。然后:

format = "%Y%m%d %H"
times = pd.to_datetime(df.YYYYMMDD + ' ' + df.HH, format=format)
df.set_index(times, inplace=True)
# and maybe for cleanup
df = df.drop(['YYYYMMDD','HH'], axis=1)
于 2013-08-30T07:15:45.510 回答