python:从几年 - 几天 -

时间:2017-01-10 15:11:40

标签: python-2.7 datetime pandas dataframe

假设我有一个非常简单的数据框:

>>> 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')

1 个答案:

答案 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 datesaxis=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'>