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

时间读入为时间增量,前面有大量天

  •  0
  • natemcintosh  · 技术社区  · 6 年前

    我正在处理一组过去一年左右的睡眠数据。我已将csv读入pandas数据框。其中有一列名为 'Duration' 是的。我将其转换为时间增量,如下所示:

    df.Duration = pd.to_timedelta(df.Duration)
    df.Duration.head()
    

    哪些输出

    0   17711 days 08:27:00
    1   17711 days 07:56:00
    2   17711 days 04:22:00
    3   17711 days 07:29:00
    4   17711 days 06:46:00
    Name: Duration, dtype: timedelta64[ns]
    

    我有点理解为什么我能提前17711天,但我真正想要的是时间。为了解决这个问题,我可以写

    df.Duration = (df.Duration - pd.Timedelta('17711 days'))
    

    这给了我

    0   08:27:00
    1   07:56:00
    2   04:22:00
    3   07:29:00
    4   06:46:00
    Name: Duration, dtype: timedelta64[ns]
    

    然而,这是一个相当脆弱的方法。有没有更好的方法来获得我想要的时间?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Tomas Farias    6 年前

    datetime.timdelta 对象将天、秒和微秒存储为属性。我们可以通过 pandas.DataFrame 具有 dt 以下内容:

    设置一些虚拟数据

    import datetime as dt
    import pandas as pd
    
    df = pd.DataFrame(
        data=(
            dt.timedelta(days=17711, hours=i, minutes=i, seconds=i) for i in range(0, 10)
        ), 
        columns=['Duration']
    )
    
    print(df['Duration'])
    
                 Duration
    0 17711 days 00:00:00
    1 17711 days 01:01:01
    2 17711 days 02:02:02
    3 17711 days 03:03:03
    4 17711 days 04:04:04
    5 17711 days 05:05:05
    6 17711 days 06:06:06
    7 17711 days 07:07:07
    8 17711 days 08:08:08
    9 17711 days 09:09:09
    Name: Duration, dtype: timedelta64[ns]
    

    计算秒数并将其转换为小时

    print(df['Duration'].dt.seconds / 3600)
    
    0    0.000000
    1    1.016944
    2    2.033889
    3    3.050833
    4    4.067778
    5    5.084722
    6    6.101667
    7    7.118611
    8    8.135556
    9    9.152500
    Name: Duration, dtype: float64    
    

    只有几个小时

    print(df['Duration'].dt.seconds // 3600)
    
    0    0
    1    1
    2    2
    3    3
    4    4
    5    5
    6    6
    7    7
    8    8
    9    9
    Name: Duration, dtype: int64
    
        2
  •  0
  •   l'L'l    6 年前

    使用 split() 使用regex应该做你想做的事我想:

    df[['Days', 'Time']] = df['Duration'].str.split('.* days', expand=True)
    

    这将把列分成两部分,然后您可以使用“time”键调用它。

    代码 以下内容:

    >>> import pandas as pd
    >>> d = ['17711 days 08:27:00', 
    ...      '17711 days 07:56:00',
    ...      '17711 days 04:22:00',
    ...      '17711 days 07:29:00',
    ...      '17711 days 06:46:00']
    >>> df = pd.DataFrame({'Duration': d})
    >>> df[['Days', 'Time']] = df['Duration'].str.split('.* days', expand=True)
    >>> df.Time = pd.to_timedelta(df.Time)
    >>> df.Time.head()
    0   08:27:00
    1   07:56:00
    2   04:22:00
    3   07:29:00
    4   06:46:00
    Name: Time, dtype: timedelta64[ns]