我正在尝试阅读包含日期的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
答案 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])