【问题标题】:Break values of one column into two columns将一列的值分成两列
【发布时间】:2016-10-29 03:49:52
【问题描述】:

我有一个数据框,其中有一列“last_updated”,类型为 datetime64[ns]:

df = pd.DataFrame({'last_updated': ['11/12/14 2:44 PM','5/18/15 11:36 AM','11/12/14 
3:09 PM']})

我想从这一单列中创建两列 - “last_updated_date”和“last_updated_time”。此外,时间应为 24 小时制。

如何使用 pandas 完成这项任务?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    试试这个:

    In [89]: df['last_updated_date'] = pd.to_datetime(df.last_updated).dt.normalize()
    
    In [90]: df['last_updated_time'] = pd.to_datetime(df.last_updated).dt.time
    
    In [91]: df
    Out[91]:
           last_updated last_updated_date last_updated_time
    0  11/12/14 2:44 PM        2014-11-12          14:44:00
    1  5/18/15 11:36 AM        2015-05-18          11:36:00
    2  11/12/14 3:09 PM        2014-11-12          15:09:00
    

    如果你想更快地做到这一点并且你准备牺牲一些内存,你可以这样做:

    In [95]: df
    Out[95]:
           last_updated
    0  11/12/14 2:44 PM
    1  5/18/15 11:36 AM
    2  11/12/14 3:09 PM
    
    In [96]: d = pd.to_datetime(df.last_updated)
    
    In [97]: df['last_updated_date'] = d.dt.normalize()
    
    In [98]: df['last_updated_time'] = d.dt.time
    
    In [99]: del d
    
    In [100]: df
    Out[100]:
           last_updated last_updated_date last_updated_time
    0  11/12/14 2:44 PM        2014-11-12          14:44:00
    1  5/18/15 11:36 AM        2015-05-18          11:36:00
    2  11/12/14 3:09 PM        2014-11-12          15:09:00
    

    更新:将日期和时间列保存到 Excel

    为了正确存储时间,我会将时间转换为字符串/对象 dtype:

    df['last_updated_time'] = d.dt.strftime('%H:%M:%S')
    

    现在我们可以将其保存到 Excel:

    In [133]: writer = pd.ExcelWriter(r'd:/temp/a.xlsx', datetime_format='YYYY-MM-DD')
    
    In [134]: df.to_excel(writer, index=False)
    
    In [135]: writer.close()
    

    结果(d:/temp/a.xlsx):

    【讨论】:

    • 这行得通。我可以看到正确的输出。但是当我使用 to_excel 函数将结果导出到 excel 中时,我会得到这种格式的日期 - 2014-11-12 00:00:00,时间为 - 0.614189468。
    • @Dreamer,这有点棘手。请看here
    • 你能按照我的要求帮我解决这个问题吗?我对此很陌生。
    【解决方案2】:

    您可以将 datetime 列转换为 24 小时格式后的字符串(日期和时间部分),如下所示:

    new_cols = ['last_updated_date', 'last_updated_time']
    df[new_cols] = pd.to_datetime(df['last_updated'], format='%m/%d/%y %I:%M %p')   \
                     .astype(str).str.split(expand=True)
    
    df
    

    这将在将其导出到 excel 时保持原样。

    【讨论】:

    • last_updated_date 现在以完美的格式出现,即使是一个 excel。对于时间,附加了一个额外的随机数,我不确定它是什么。例如:14:44:25.970、11:36:39.903
    • @Dreamer,试试这个:df[new_cols] = pd.to_datetime(df.last_updated).dt.strftime('%Y-%m-%d %H:%M:%S').str.split(expand=True)
    • @Dreamer,我觉得这个解决方案比我的好
    • 你们俩给出的解决方案效果很好。非常感谢你们!
    猜你喜欢
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多