2017-07-20 102 views
3

初学者python(以及大熊猫)用户。我正在尝试将一些数据导入到熊猫数据框中。其中一列是日期,但格式为“YYYYMM”。我试图做什么最论坛回答表明:Python - Pandas - 将YYYYMM转换为datetime

df_cons['YYYYMM'] = pd.to_datetime(df_cons['YYYYMM'], format='%Y%m') 

这不工作,虽然(ValueError: unconverted data remains: 3)。该列实际上包含每年的附加值,MM = 13。来源使用此行作为过去一年的平均值。我猜测to_datetime有问题。

任何人都可以提供一个快速解决方案,或者去掉所有的年平均值(那些最后两位数字为“13”),或者让to_datetime忽略它们吗?

+0

您是否在导入数据时尝试解析它?例如,如果你在pandas中用'read_csv'读取一个csv,你有一个参数'parse_dates = [your_col_name]' – ysearka

回答

1

errors='coerce'然后dropnaNaT行:

df_cons['YYYYMM'] = pd.to_datetime(df_cons['YYYYMM'], format='%Y%m', errors='coerce').dropna() 

达夫月值将转换为:NaT

In[36]: 
pd.to_datetime('201613', format='%Y%m', errors='coerce') 

Out[36]: NaT 

另外,您可以转换

df_cons['YYYYMM'] = pd.to_datetime(df_cons.loc[df_cons['YYYYMM'].str[-2:] != '13','YYYYMM'], format='%Y%m', errors='coerce') 
先筛选出来

虽然这可能导致对齐问题,因为返回的系列需要具有相同的长度,所以只需传递errors='coerce'就可以更简单地解决问题

+0

非常感谢。它看起来像'.dropna()'实际上并没有为我放置'NaT'行,但我认为我可以指出这一点。 – Mtd240

+0

你可能需要做一个单独的步骤,所以在分配后,然后调用'dropna()' – EdChum

+0

这工作 - 再次感谢! – Mtd240

0

首先清理数据帧。

df_cons = df_cons[~df_cons['YYYYMM'].str.endswith('13')] 
df_cons['YYYYMM'] = pd.to_datetime(df_cons['YYYYMM']) 

可能我建议把柱子变成了一段指数如果YYYYMM列在您的数据集中是唯一。

首先将YYYYMM转换为索引,然后将其转换为月期。

df_cons = df_cons.reset_index().set_index('YYYYMM').to_period('M')