从Pandas Datetime列中提取月份和年份

 tuiqiu 发布于 2022-12-29 19:57

我有一个Dataframe,df,包含以下列:

df['ArrivalDate'] =
...
936   2012-12-31
938   2012-12-29
965   2012-12-31
966   2012-12-31
967   2012-12-31
968   2012-12-31
969   2012-12-31
970   2012-12-29
971   2012-12-31
972   2012-12-29
973   2012-12-29
...

该列的元素是pandas.tslib.Timestamp.

我想要包括年份和月份.我认为会有简单的方法,但我无法弄清楚.

这是我尝试过的:

df['ArrivalDate'].resample('M', how = 'mean')

我收到以下错误:

Only valid with DatetimeIndex or PeriodIndex 

然后我尝试了:

df['ArrivalDate'].apply(lambda(x):x[:-2])

我收到以下错误:

'Timestamp' object has no attribute '__getitem__' 

有什么建议?

编辑:我有点想通了.

df.index = df['ArrivalDate']

然后,我可以使用索引重新采样另一列.

但我仍然想要一种重新配置整个列的方法.有任何想法吗?

7 个回答
  • 您可以直接访问yearmonth属性,或者请求datetime.datetime:

    In [15]: t = pandas.tslib.Timestamp.now()
    
    In [16]: t
    Out[16]: Timestamp('2014-08-05 14:49:39.643701', tz=None)
    
    In [17]: t.to_pydatetime() #datetime method is deprecated
    Out[17]: datetime.datetime(2014, 8, 5, 14, 49, 39, 643701)
    
    In [18]: t.day
    Out[18]: 5
    
    In [19]: t.month
    Out[19]: 8
    
    In [20]: t.year
    Out[20]: 2014
    

    将年份和月份组合在一起的一种方法是对它们进行整数编码,例如:2014082014年8月.在整个列中,您可以这样做:

    df['YearMonth'] = df['ArrivalDate'].map(lambda x: 100*x.year + x.month)
    

    或其许多变体.

    但是,我并不是这样做的忠实粉丝,因为它会使日期对齐和算术变得更加痛苦,对于那些在没有相同约定的情况下遇到代码或数据的人来说尤其痛苦.更好的方法是选择一个月日约定,例如最终非美国假日工作日或第一天等,并将数据保留为具有所选日期约定的日期/时间格式.

    calendar模块可用于获取某些天的数值,例如最后一个工作日.然后你可以这样做:

    import calendar
    import datetime
    df['AdjustedDateToEndOfMonth'] = df['ArrivalDate'].map(
        lambda x: datetime.datetime(
            x.year,
            x.month,
            max(calendar.monthcalendar(x.year, x.month)[-1][:5])
        )
    )
    

    如果您正在寻找一种方法来解决将datetime列格式化为某种字符串化表示的简单问题,那么您可以使用该类中的strftime函数datetime.datetime,如下所示:

    In [5]: df
    Out[5]: 
                date_time
    0 2014-10-17 22:00:03
    
    In [6]: df.date_time
    Out[6]: 
    0   2014-10-17 22:00:03
    Name: date_time, dtype: datetime64[ns]
    
    In [7]: df.date_time.map(lambda x: x.strftime('%Y-%m-%d'))
    Out[7]: 
    0    2014-10-17
    Name: date_time, dtype: object
    

    2022-12-29 19:57 回答
  • 如果你想要月份独特的一对,使用apply非常光滑.

    df['mnth_yr'] = df['date_column'].apply(lambda x: x.strftime('%B-%Y')) 
    

    在一栏中输出月份年份.

    别忘了先将格式改为日期时间,我一般都会忘记:|

    df['date_column'] = pd.to_datetime(df['date_column'])
    

    2022-12-29 19:57 回答
  • 提取年份说自['2018-03-04']

    df['Year'] = pd.DatetimeIndex(df['date']).year  
    

    df ['Year']创建一个新列.如果你想提取月份只需使用.month

    2022-12-29 19:58 回答
  • 如果您想要分别显示年份和月份的新列,则可以执行以下操作:

    df['year'] = pd.DatetimeIndex(df['ArrivalDate']).year
    df['month'] = pd.DatetimeIndex(df['ArrivalDate']).month
    

    要么...

    df['year'] = df['ArrivalDate'].dt.year
    df['month'] = df['ArrivalDate'].dt.month
    

    然后你可以将它们组合起来或者像它们一样使用它们.

    2022-12-29 19:58 回答
  • 您可以首先使用pandas.to_datetime转换日期字符串,这使您可以访问所有的numpy datetime和timedelta工具。例如:

    df['ArrivalDate'] = pandas.to_datetime(df['ArrivalDate'])
    df['Month'] = df['ArrivalDate'].values.astype('datetime64[M]')
    

    2022-12-29 19:58 回答
  • 找到最佳方式 !!

    df['date_column']必须是日期时间格式.

    df['month_year'] = df['date_column'].dt.to_period('M')
    

    您也可以使用DDay,2M2个月等不同的采样间隔,如果有时间序列数据带有时间戳,我们可以采用粒度采样间隔,例如45Min45分钟,15Min15分钟采样等.

    2022-12-29 19:58 回答
  • 感谢jaknap32,我想根据Year和Month汇总结果,所以可以这样:

    df_join['YearMonth'] = df_join['timestamp'].apply(lambda x:x.strftime('%Y%m'))
    

    输出整洁:

    0    201108
    1    201108
    2    201108
    

    2022-12-29 20:01 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有