【问题标题】:Subtracting time within a column in pandas在熊猫的一列中减去时间
【发布时间】:2019-02-05 22:00:39
【问题描述】:

我一直在尝试减去使用 pandas 数据框读入 python 的列之间的日期和时间。我写的代码如下:

Time = df['t'] - df['t'].shift(1) + df['t']

这会导致错误消息。我的输入和预期输出如下所述

Input data:
t =
9:47:00
9:48:00
9:49:00
9:50:00
9:51:00
9:52:00
9:53:00
9:54:00

我希望代码会产生输出数据(从零开始的累积小时数。

0
0.016666667
0.033333333
0.05
0.066666667
0.083333333
0.1

我还尝试使用datetime.strptime('t',"%H:%M:%S.%f") 将其转换为字符串,但仍然出现错误。

任何建议将不胜感激。

【问题讨论】:

  • Minimal, complete, verifiable example 在这里适用:请提供重现问题的代码段,而不是单行 sn-ps。您的单行代码仅引用一列——其中两个术语是相同的。
  • 您似乎得到了 2t - t[-1] 的结果,无论如何这很可能不是您想要的。我建议放弃最后一个df['t']

标签: python pandas


【解决方案1】:

类似于 Chris 的解决方案。您应该从一开始就与timedeltas 合作以获得更简单的解决方案。

v = pd.to_timedelta(df['t'])
((v - v.shift())).dt.total_seconds().cumsum().div(3600).fillna(0)

0    0.000000
1    0.016667
2    0.033333
3    0.050000
4    0.066667
5    0.083333
6    0.100000
7    0.116667
Name: t, dtype: float64

【讨论】:

    【解决方案2】:

    import pandas as pd
    
    # assuming you're working with strings:
    t = [
        '9:47:00', '9:48:00', '9:49:00', '9:50:00',
        '9:51:00', '9:52:00', '9:53:00', '9:54:00'
    ]
    
    df = pd.DataFrame({'time' : pd.to_datetime(t, infer_datetime_format=True)})
    print(df)
    #>                  time
    #> 0 2018-08-30 09:47:00
    #> 1 2018-08-30 09:48:00
    #> 2 2018-08-30 09:49:00
    #> 3 2018-08-30 09:50:00
    #> 4 2018-08-30 09:51:00
    #> 5 2018-08-30 09:52:00
    #> 6 2018-08-30 09:53:00
    #> 7 2018-08-30 09:54:00
    
    df['time_shift'] = df.shift(-1)
    df['tdelt'] = df['time_shift'] - df['time']
    x = df.tdelt.astype('timedelta64[s]') / 3600
    x = x[1:-1].cumsum()
    print(x)
    #> 1    0.016667
    #> 2    0.033333
    #> 3    0.050000
    #> 4    0.066667
    #> 5    0.083333
    #> 6    0.100000
    #> Name: tdelt, dtype: float64
    

    reprexpy package于 2018 年 8 月 30 日创建

    import reprexpy
    print(reprexpy.SessionInfo())
    #> Session info --------------------------------------------------------------------
    #> Platform: Windows-7-6.1.7601-SP1 (64-bit)
    #> Python: 3.6
    #> Date: 2018-08-30
    #> Packages ------------------------------------------------------------------------
    #> pandas==0.23.4
    #> reprexpy==0.1.1
    

    【讨论】:

    • 相信你也可以用pd.Series.diff代替创建助手系列。
    • 无法使用您建议的方法。这是错误消息:文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/core/tools/datetimes.py”,第368行,在_convert_listlike require_iso8601=require_iso8601文件“pandas/_libs/tslib.pyx”,第 492 行,在 pandas._libs.tslib.array_to_datetime 文件“pandas/_libs/tslib.pyx”,第 744 行,在 pandas._libs.tslib.array_to_datetime 文件“pandas/_libs/ tslib.pyx”,第 677 行,在 pandas._libs.tslib.array_to_datetime TypeError: is not convertible to datetime >>>
    • 您使用的是什么版本的熊猫?我的解决方案使用了 0.23.4。
    【解决方案3】:

    我认为this 是一个答案。

    或者也许以其他方式 -

    # lets have some data to process:
    stamps = pd.date_range('2018-05-19 18:15:05', periods=4, freq='2H')
    df = pd.DataFrame(stamps)
    
    df.apply(lambda e : e + datetime.timedelta(seconds=1))
    

    演出:

                    0
    0 2018-05-19 18:15:06
    1 2018-05-19 20:15:06
    2 2018-05-19 22:15:06
    3 2018-05-20 00:15:06
    

    还有这个:

    df.apply(lambda e : e + datetime.timedelta(seconds=100))
    
                        0
    0 2018-05-19 18:16:45
    1 2018-05-19 20:16:45
    2 2018-05-19 22:16:45
    3 2018-05-20 00:16:45
    

    只是为了看看区别。这里的提示是坚持日期。这样timedelta 就可以了。您可以使用combineDateTime 生成Datetime

    【讨论】:

      猜你喜欢
      • 2015-09-19
      • 1970-01-01
      • 2020-10-08
      • 2018-11-15
      • 2017-11-19
      • 2020-05-16
      • 2020-01-05
      • 2015-07-02
      相关资源
      最近更新 更多