Время читается как дельта времени с большим количеством дней впереди - PullRequest
0 голосов
/ 30 июня 2018

Я работаю с набором данных моего сна за последний год или около того. Я прочитал CSV в панде Dataframe. В нем есть столбец с именем '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 голосов
/ 30 июня 2018

Использование 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]
0 голосов
/ 30 июня 2018

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