熊猫解析来自 CSV 的日期



我正在尝试读取包含日期的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-block 结束,int(string_[:4])因为它包含一个括号,显然不能转换为 int。解析函数旨在一次仅解析一个日期(例如 20150420 )首先。

我做错了什么?

编辑:

好的,我刚刚在熊猫文档中阅读了有关date_parser论点的信息,它似乎按预期工作(当然;))。所以我需要调整我的代码以适应这一点。我上面的例子是从其他地方复制粘贴的,我希望它能工作,因此,我的问题..当我进行代码调整时,我会报告。

编辑2:

我的解析函数现在看起来像这样,我认为代码现在可以工作了。如果我仍然做错了什么,请告诉我:

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

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

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

你可以试试这个解析器:

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)

相关内容

  • 没有找到相关文章

最新更新