【问题标题】:pandas - Use datetime.time objects as a dtypepandas - 使用 datetime.time 对象作为 dtype
【发布时间】:2016-01-15 11:08:53
【问题描述】:

我正在读取具有以下结构的 Excel 文件:

    A               B 
2015-09-05       15:05:32
2015-09-05       19:05:02

我正在阅读这个文件

df = pd.ExcelFile(filename).parse(..)

当我查看此 DataFrame 的 dtype 时,我可以看到日期被正确解析为 datetime64 对象,但时间不是:

>>> df.dtypes
     A         datetime64[ns]
     B         object

奇怪的是,当我查看B 的内容时,我发现它们都是datetime.time 对象

[s for s in main_df['B'].tolist() if type(s) is not datetime.time]
# There are no values that are *not* datetime.time objects

我想将此B 列转换为我可以更方便地使用的内容。例如,我想先使用MultiIndex,然后使用时间(以便我可以分组和汇总)。或者我想加入两者,这样我就有一个单独的列,即完整的日期。

但在这一点上,我被困住了。我尝试将它们转换为datetime

main_df['B'] = main_df['B'].astype('datetime64')
ValueError: Could not convert object to NumPy datetime

有什么想法吗?

【问题讨论】:

    标签: python datetime pandas time-series


    【解决方案1】:

    如果你只想加入两者,你可以将它们作为字符串加入:

    df = pd.DataFrame({ 'A' : ['2015-09-05', '2015-09-05'], 'B': ['15:05:32', '19:05:02']})
    pd.to_datetime(df.A + ' ' + df.B)
    

    或者你可以使用 datetime 来组合:

    import datetime
    
    df.apply(lambda x: datetime.datetime.combine(x.A, x.B), axis=1)
    

    【讨论】:

    • 这在 dtypes 都是对象时部分有效,但如果其中一个 dtypes 是datetime64,则会出错。如果在两行之间添加它,例如:df['A'] = df['A'].astype('datetime64')
    • 我猜你可以在读入时将其 dtype 指定为字符串,或者在编辑后的答案中使用 datetime。
    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 2014-04-03
    • 2015-12-17
    • 2017-09-15
    • 2023-02-10
    • 1970-01-01
    相关资源
    最近更新 更多