【问题标题】:python: obtaining a column of dates from the columns of years-months-dayspython:从年-月-日的列中获取一列日期
【发布时间】:2017-05-25 03:11:08
【问题描述】:

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

>>> 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'occurred at index monthE')

【问题讨论】:

    标签: python-2.7 datetime pandas dataframe


    【解决方案1】:

    我认为您可以先删除最后一个字符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'>
    

    【讨论】:

    • 我认为我们可以即时重命名列:df['date'] = pd.to_datetime(df.rename(columns = lambda x: x[:-1])),因此我们可以保留原始列名
    猜你喜欢
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    相关资源
    最近更新 更多