时间读为时间增量,前面有很多天

时间:2018-06-30 01:35:57

标签: python pandas datetime timedelta

过去一年左右的时间里,我正在使用我的睡眠数据集。我已经将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]

但是,这是一种非常脆弱的方法。有一种更好的方法来获取我想要的时间吗?

2 个答案:

答案 0 :(得分:1)

datetime.timdelta对象将天,秒和微秒存储为属性。我们可以使用pandas.DataFramedt中访问它们:

设置一些虚拟数据

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

答案 1 :(得分:0)

使用split()和正则表达式应该可以满足您的需求:

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

这会将列分为两部分,然后您可以使用“时间”键调用它。

代码

>>> 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]