过去一年左右的时间里,我正在使用我的睡眠数据集。我已经将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]
但是,这是一种非常脆弱的方法。有一种更好的方法来获取我想要的时间吗?
答案 0 :(得分:1)
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
答案 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]