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