假设我有一个非常简单的数据框:
>>> a
Out[158]:
monthE yearE dayE
0 10 2014 15
1 2 2012 15
2 2 2014 15
3 12 2015 15
4 2 2012 15
假设我想使用三列整数创建具有与每一行相关的日期的列。 当我有简单的数字时就足够了:
>>> datetime.date(1983,11,8)
Out[159]: datetime.date(1983, 11, 8)
如果我必须创建一个日期列(理论上是一个非常基本的请求),而是:
a.apply(lambda x: datetime.date(x['yearE'],x['monthE'],x['dayE']))
我收到以下错误:
KeyError :(' yearE',u'发生在索引月份E')
答案 0 :(得分:3)
我认为你可以先删除最后一个字符E
,然后使用to_datetime
,然后获取pandas timestamps
而不是python dates
:
df.columns = df.columns.str[:-1]
df['date'] = pd.to_datetime(df)
#if multiple columns filter by subset
#df['date'] = pd.to_datetime(df[['year','month','day']])
print (df)
month year day date
0 10 2014 15 2014-10-15
1 2 2012 15 2012-02-15
2 2 2014 15 2014-02-15
3 12 2015 15 2015-12-15
4 2 2012 15 2012-02-15
print (df.date.dtypes)
datetime64[ns]
print (df.date.iloc[0])
2014-10-15 00:00:00
print (type(df.date.iloc[0]))
<class 'pandas.tslib.Timestamp'>
感谢MaxU
寻求解决方案:
df['date'] = pd.to_datetime(df.rename(columns = lambda x: x[:-1]))
#if another columns in df
#df['date'] = pd.to_datetime(df[['yearE','monthE','dayE']].rename(columns=lambda x: x[:-1]))
print (df)
monthE yearE dayE date
0 10 2014 15 2014-10-15
1 2 2012 15 2012-02-15
2 2 2014 15 2014-02-15
3 12 2015 15 2015-12-15
4 2 2012 15 2012-02-15
但如果真的需要python dates
将axis=1
添加到apply
,但是不可能使用一些pandas函数:
df['date'] =df.apply(lambda x: datetime.date(x['yearE'],x['monthE'],x['dayE']), axis=1)
print (df)
monthE yearE dayE date
0 10 2014 15 2014-10-15
1 2 2012 15 2012-02-15
2 2 2014 15 2014-02-15
3 12 2015 15 2015-12-15
4 2 2012 15 2012-02-15
print (df.date.dtypes)
object
print (df.date.iloc[0])
2014-10-15
print (type(df.date.iloc[0]))
<class 'datetime.date'>