【问题标题】:Parsing dates from two different rows in Pandas从 Pandas 中的两个不同行解析日期
【发布时间】:2018-08-02 10:25:11
【问题描述】:

我在 Pandas DataFrame 的两个不同行中有日期和时间戳。任何指针如何在一行中一起解析日期和时间,可以进一步用于时间序列分析?

例如

Row 1 Date            2017-12-11 00:00:00   2017-12-11 00:00:00     2017-12-11 00:00:00     2017-12-11 00:00:00 

Row 2 Timestamp             01:00:00              02:00:00                03:00:00              04:00:00 

然后是更多的行有更多的数据

第 1 行和第 2 行可以组合在一起以获得完整的日期/时间戳信息吗?

我正在考虑应用 Transpose,然后在列上使用 parse_dates。在 python 中还有其他直接的方法吗?

【问题讨论】:

    标签: python python-3.x pandas datetime


    【解决方案1】:

    我认为最好将DataFrame 首先转换为columnsrows 为每列相同的dtypes:

    df = df.T
    

    然后将列Date 转换为to_datetime 并添加Time 转换后的to_timedelta

    df['dates'] = pd.to_datetime(df['Date']) + pd.to_timedelta(df['Time'])
    

    【讨论】:

    • 唯一的问题是,其他行中有更多数据。如果数据框仅包含日期和时间戳,则转置是一个好主意。
    • @Matthias - 是的,这取决于数据。
    • pd.to_timedelta(df['Time']) - 当我在转置后将它应用到我的数据帧时,它会抛出以下错误:有什么建议可以摆脱这个吗? TypeError: object of 'datetime.time' has no len() 在处理上述异常的过程中,又发生了一个异常:ValueError Traceback (最近一次调用最后一次)
    • @Mandy - pd.to_datetime(df['Date']) + pd.to_timedelta(df['Time'].astype(str)) 工作怎么样?
    【解决方案2】:

    如果您使用时间序列数据,我强烈建议您将 datetime 组件作为索引。当您的数据框具有包含非重复值的索引时,您可能会发现操作更有效。

    您首先转置数据帧的想法很好。这是一个最小的例子:

    df = pd.DataFrame([['2017-12-11 00:00:00', '2017-12-11 00:00:00',
                        '2017-12-11 00:00:00', '2017-12-11 00:00:00'],
                       ['01:00:00', '02:00:00', '03:00:00', '04:00:00'],
                       [1, 2, 3, 4], [5, 6, 7, 8]],
                      index=['Date', 'Timestamp', 'Data1', 'Data2'])
    
    df = df.T
    df.index = pd.to_datetime(df.pop('Date')) + pd.to_timedelta(df.pop('Timestamp'))
    

    结果数据框:

    print(df)
    
                        Data1 Data2
    2017-12-11 01:00:00     1     5
    2017-12-11 02:00:00     2     6
    2017-12-11 03:00:00     3     7
    2017-12-11 04:00:00     4     8
    

    你现在有一个DatetimeIndex

    print(df.index)
    
    DatetimeIndex(['2017-12-11 01:00:00', '2017-12-11 02:00:00',
                   '2017-12-11 03:00:00', '2017-12-11 04:00:00'],
                  dtype='datetime64[ns]', freq=None)
    

    【讨论】:

    • pd.to_timedelta 适用于您的示例代码,但是当我在转置后将它与我的数据帧数据一起使用时,它会抛出 TypeError: TypeError: object of type 'datetime.time' has no len() 期间处理上述异常时,又发生了一个异常:知道如何避免这个错误吗?
    • pd.to_timedelta(df['Time'].astype(str)) 为我工作
    猜你喜欢
    • 2015-09-01
    • 2017-12-18
    • 2018-10-10
    • 2021-02-07
    • 2023-03-17
    • 2015-11-03
    • 2016-03-04
    • 2016-06-04
    • 1970-01-01
    相关资源
    最近更新 更多