代码之家  ›  专栏  ›  技术社区  ›  Cam

Pandas列表日期到日期时间

  •  1
  • Cam  · 技术社区  · 2 月前

    我希望将列表[D,M,Y]中包含日期的列转换为日期时间列。下面的方法有效,但一定有更好的方法吗?

    new_df = pd.DataFrame({'date_parts': [[29, 'August', 2024], [28, 'August', 2024], [27, 'August', 2024]]})
    display(new_df)
    
    ## Make new columns with dates
    new_df = pd.concat([new_df, new_df['date_parts'].apply(pd.Series)], axis=1).rename(columns={0:'D', 1:'M', 2:'Y'})
    
    month_map = {
    'January':1,
    'February':2,
    'March':3,
    'April':4,
    'May':5,
    'June':6,
    'July':7,
    'August':8,
    'September':9,
    'October':10,
    'November':11,
    'December':12
    }
    
    ## make datetime column
    new_df['release_date'] = pd.to_datetime(dict(year=new_df.Y, month=new_df.M.apply(lambda x: month_map[x]), day=new_df.D),  format='%d-%B-%Y') 
    new_df.drop(columns=['D', 'M', 'Y'])
    
    ## Input
        date_parts
    0   [29, August, 2024]
    1   [28, August, 2024]
    2   [27, August, 2024]
    
    ## Output
        date_parts          release_date
    0   [29, August, 2024]  2024-08-29
    1   [28, August, 2024]  2024-08-28
    2   [27, August, 2024]  2024-08-27
    
    1 回复  |  直到 2 月前
        1
  •  1
  •   mozway    2 月前

    只需将这些部分组合成一个字符串,然后传递给 to_datetime :

    new_df['release_date'] = pd.to_datetime(new_df['date_parts']
                                            .apply(lambda x: '-'.join(map(str, x))),
                                            format='%d-%B-%Y')
    

    输出:

               date_parts release_date
    0  [29, August, 2024]   2024-08-29
    1  [28, August, 2024]   2024-08-28
    2  [27, August, 2024]   2024-08-27
    

    您还可以将列表列表转换为具有日/月/年列的DataFrame:

    new_df['release_date'] = pd.to_datetime(
        pd.DataFrame(
            new_df['date_parts'].to_list(),
            index=new_df.index,
            columns=['day', 'month', 'year'],
        ).replace({'month': month_map})
    )