大熊猫从csv解析日期

时间:2015-06-16 10:14:16

标签: parsing datetime pandas

我正在尝试阅读包含日期的csv文件。 csv看起来像这样:

h1,h2,h3,h4,h5
A,B,C,D,E,20150420
A,B,C,D,E,20150420
A,B,C,D,E,20150420

为了阅读csv,我使用以下代码:

df = pd.read_csv(filen,
    index_col=None,
    header=0,
    parse_dates=[5],
    date_parser=lambda t:parse(t))

解析函数如下所示:

def parse(t):
    string_ = str(t)
    try:
        return datetime.date(int(string_[:4]), int(string_[4:6]), int(string_[6:]))
    except:
        return datetime.date(1900,1,1)

我现在的奇怪问题是,在解析函数中,t看起来像这样:

ndarray: ['20150420' '20150420' '20150420']

正如您所看到的,t是数据列的整个数组。我认为它应该只是解析第一行时的第一个值,第二个值,解析第二行时等等。现在,parse总是在except块中结束,因为int(string_[:4])包含一个括号,显然不能转换为int。构建解析函数的目的是一次只解析一个日期(例如20150420)。

我做错了什么?

修改

好吧,我刚刚在pandas doc中读到了关于date_parser参数的内容,它似乎按预期工作(当然;))。所以我需要调整我的代码。我上面的例子是从其他地方复制和粘贴的,我希望它可以工作,因此,我的问题......当我进行代码调整时,我会报告回来。

EDIT2:

我的解析功能现在看起来像这样,我认为,代码现在可以工作了。如果我还在做错事,请告诉我:

def parse(t):
    ret = []
    for ts in t:
        string_ = str(ts)
        try:
            tsdt = datetime.date(int(string_[:4]), int(string_[4:6]), int(string_[6:]))
        except:
            tsdt = datetime.date(1900,1,1)
        ret.append(tsdt)
    return ret

2 个答案:

答案 0 :(得分:2)

你可以尝试这个解析器:

parser = lambda x: pd.to_datetime(x, format='%Y%m%d', coerce=True)

并使用

df = pd.read_csv(filen,
index_col=None,
header=0,
parse_dates=[5],
date_parser=parser)

答案 1 :(得分:1)

有六列,但第一行只有五个标题。这就是parse_dates失败的原因。你可以跳过第一行:

df = pd.read_csv("tmp.csv",  header=None, skiprows=1, parse_dates=[5])