我在将CSV文件加载到Pandas然后加载到数据库时遇到问题。 问题似乎是文件的编码,尽管错误输出是指日期格式。
ValueError: time data '2018-01-10 00:00:00.000' does not match format '%d.%m.%y'
在文本编辑器中打开CSV文件时,日期字段值以下列方式显示:
10-01-18
代替10-01-2018
。
我已在文本编辑器中打开CSV文件,使用编码utf-8
保存,但错误仍然存在。
此外,当我在Excel中打开CSV文件时,选择单元格为10-01-2018
时,会正确显示日期值。在选择单元格之前,该值显示为10-01-18
。
下面的代码片段将文件读入数据帧,稍后我有一个函数设置为将日期值转换为可在数据库中使用的语法 - %d-%m-%Y
。
该函数通常接收一个日期字段数组,为简单起见,我给它一个字段。
代码段:
df = pd.read_csv(full_path, encoding='utf-8', sep=';', keep_default_na=True, header=0)
def filter_date_values(df, date_cols=['report_date']):
for col in date_cols:
if col in df.columns:
for index, row in df.iterrows():
z = df.ix[index, col]
if isinstance(z, unicode):
py_date = datetime.strptime(str(z), '%d.%m.%Y')
if py_date > pd.Timestamp.max:
df.ix[index, col] = pd.Timestamp.max
else:
x = py_date
df.ix[index, col] = x.date()
我做错了什么?或者我应该在这里改变。
感谢。
答案 0 :(得分:2)
你有三个问题:
您拥有2018-01-10 00:00:00.000
形式的数据,而且还有py_date = datetime.strptime(str(z), '%d.%m.%Y')
,您告诉Python,年份出现在字符串的末尾。如果您的所有数据都在字符串的开头有年份,那么您需要告诉Python在那里寻找它。
你不仅有日期,还有时间,但你不会告诉Python如何解析那部分。
您告诉Python您的分隔符是.
,而实际上它是-
。
最简单的方法是使用默认解析器,例如pd.to_datetime
。如果您想使用显式格式,则应将%Y移到前面,将.
更改为-
,然后删除时间部分(例如z = z.split(' ')[0]
)或说明如何你想要解析。您还应该查看是否要将日期解释为第一天,然后是月份(%d-%m),或者首先是月份,然后是日期(%m-%d)。
作为一个更广泛的问题,你似乎只是简单地将代码从某个地方复制到你的程序中而不理解它的作用和原因。
最后一点:您可以使用apply
在列上投射函数。所以你可以做到
for col in date_cols:
if col in df.columns:
df[col] = min(df[col].apply(pd.to_datetime),pd.Timestamp.max)