首页 > 解决方案 > 时间读取为时间增量,前面有大量天数

问题描述

我正在处理过去一年左右的睡眠数据集。我已将 CSV 读入熊猫数据框。其中有一列名为'Duration'. 我将其转换为 timeDelta 如下:

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]

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

标签: pythonpandasdatetimetimedelta

解决方案


datetime.timdelta对象将天、秒和微秒存储为属性。我们可以在pandas.DataFramewith中访问它们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

推荐阅读