【问题标题】:Extract year/month from date python to new columns从日期python中提取年/月到新列
【发布时间】:2019-01-26 07:56:24
【问题描述】:

我有一列包含对象类型的日期

> df['created_at_first']

结果就是这样

created_at_first
2018-07-01 02:08:06
2018-06-05 01:39:30
2018-05-16 21:18:48

我想为年、月、日、小时创建新列。 所以我得到了类似的东西:

year  month  day  hour 
2018   07    01   02
2018   06    05   01
2018   05    16   21

我该如何管理它?

【问题讨论】:

    标签: python pandas datetime dataframe


    【解决方案1】:

    也许:

    df['created_at_first'] = pd.to_datetime(df['created_at_first'])
    df['year'] = df['created_at_first'].dt.year
    df['month'] = df['created_at_first'].dt.month
    df['day'] = df['created_at_first'].dt.day
    df['hour'] = df['created_at_first'].dt.hour
    

    【讨论】:

    • 在执行第一行时出现此错误:KeyError: 'created_at_first'
    • @Michel 记得把列放在数据框中,希望对你有帮助
    • 也许因为 created_at_first 是一个对象。
    • @Michel 请再试一次我的完整代码,我将其转换为日期时间
    【解决方案2】:

    您可以尝试使用strftime,然后按照strftime('%Y-%m-%d-%H') 函数中给出的'-' 拆分。代码:

    created_at_first=["2018-07-01 02:08:06","2018-06-05 01:39:30","2018-05-16 21:18:48"]
    df=pd.DataFrame({'ColumnName':created_at_first})
    df['ColumnName']= pd.to_datetime(df['ColumnName'])
    
    df2 = pd.DataFrame(df.ColumnName.dt.strftime('%Y-%m-%d-%H').str.split('-').tolist(),
                       columns=['Year','Month','Day','Hour'],dtype=int)
    df2
        Year Month Day Hour
    0   2018    07  01   02
    1   2018    06  05   01
    2   2018    05  16   21
    

    如果您想要单个数据框中的所有列,请使用 pd.concat()axis=1

    pd.concat((df,df2),axis=1)
        ColumnName          Year Month Day Hour
    0   2018-07-01 02:08:06 2018    07  01   02
    1   2018-06-05 01:39:30 2018    06  05   01
    2   2018-05-16 21:18:48 2018    05  16   21
    

    【讨论】:

    • 我不推荐这种方法,因为您的拆分系列将是 dtype object,在 Pandas 中通常效率低下。您可以转换回int,但这提出了一个问题,为什么要从datetime -> str -> int
    • @jpp 我接受这不是最好的解决方案,但最初当我回答其他解决方案时手动分解每个元素。所以想为什么不一次把它们全部打破(DateTime 元素)。另外,我忘记了strftime 将输出作为object 数据类型添加dtype=int。感谢您花时间和知识撰写评论。谢谢。
    【解决方案3】:

    一种灵活的方法是将operator.attrgetterpd.concat 结合使用。这种方法使您可以指定任意属性列表,然后通过 pd.Series.dt 访问器提取这些属性。

    fields = ['year', 'month', 'day', 'hour']
    
    res = pd.concat(attrgetter(*fields)(df['dates'].dt), axis=1, keys=fields)
    
    print(res)
    
       year  month  day  hour
    0  2018      7    1     2
    1  2018      6    5     1
    2  2018      5   16    21
    

    设置

    import pandas as pd
    from operator import attrgetter
    
    df = pd.DataFrame({'dates': ['2018-07-01 02:08:06',
                                 '2018-06-05 01:39:30',
                                 '2018-05-16 21:18:48']})
    
    df['dates'] = pd.to_datetime(df['dates'])
    

    【讨论】:

      【解决方案4】:

      DatetimeIndex 将有助于获得所需的结果

      created_at_first=["2018-07-01 02:08:06","2018-06-05 01:39:30","2018-05-16 21:18:48"]
      import pandas as pd 
      df=pd.DataFrame({'ColumnName':created_at_first})
      df['year'] = pd.DatetimeIndex(df['ColumnName']).year
      df['month'] = pd.DatetimeIndex(df['ColumnName']).month
      df['day'] = pd.DatetimeIndex(df['ColumnName']).day
      df['hour'] = pd.DatetimeIndex(df['ColumnName']).hour
      

      官方文档:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DatetimeIndex.html

      输出:

                  columnName  year  month  day  hour
      0  2018-07-01 02:08:06  2018      7    1     2
      1  2018-06-05 01:39:30  2018      6    5     1
      2  2018-05-16 21:18:48  2018      5   16    21
      

      【讨论】:

        猜你喜欢
        • 2017-05-25
        • 2020-04-29
        • 2017-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-13
        • 1970-01-01
        • 2016-07-27
        相关资源
        最近更新 更多