Получите время, проведенное с полуночи в датафрейме - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть датафрейм со столбцом типа Timestamp.Я хочу найти время, прошедшее (в секундах) с полуночи, как новый столбец.Как это сделать простым способом?

Например: вход:

samples['time']
2018-10-01 00:00:01.000000000
2018-10-01 00:00:12.000000000

type(samples['time'].iloc[0])

<class 'pandas._libs.tslib.Timestamp'>

Выход:

samples['time_elapsed']
1
12

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Делать это в Пандах очень просто!

midnight = pd.Timestamp('2018-10-01 00:00:00')
print(pd.Timestamp('2018-10-01 00:00:01.000000000') - midnight).seconds
>
1

И в качестве расширения мы можем использовать apply для Панд серии:

samples = pd.DataFrame(['2018-10-01 00:00:01.000000000', '2018-10-01 00:00:12.000000000'], columns=['time'])
samples.time = pd.to_datetime(samples.time)
midnight = pd.Timestamp('2018-10-01 00:00:00')
samples['time_elapsed'] = samples['time'].apply(lambda x: (x - midnight).seconds)
samples
>
        time    time_elapsed
0   2018-10-01 00:00:01     1
1   2018-10-01 00:00:12     12

Обратите внимание, что ответы здесь используйте альтернативный метод: сравнивая метку времени с самим собой, преобразованную в дату.Это нули всех временных данных и, следовательно, эквивалент полуночи того дня.Этот метод может быть немного более производительным.

0 голосов
/ 20 февраля 2019

Обратите внимание, что часть даты в каждой строке может отличаться (не от одного и того же дня), поэтому вы не можете использовать любую "базовую дату" ( полночь ) для всего DataFrame, так какможно увидеть в одном из других решений.

Моим намерением также было не «загрязнять» исходный DataFrame какими-либо промежуточными столбцами, например, time (фактически дата и время) в виде преобразованной строкив "true" DateTime .

Тогда я предлагаю следующее:

  • преобразовать строку DateTime в DateTime,
  • взять часть времени из нее,
  • вычислить числосекунды из часа / минуты / второй части.

Все вышеперечисленные шаги в выделенной функции.

Итак, чтобы выполнить задачу, определите функцию:

def secSinceNoon(datTimStr):
    tt = pd.to_datetime(datTimStr).time()
    return tt.hour * 3600 + tt.minute * 60 + tt.second

Затем позвоните:

samples['Secs'] = samples.time.apply(secSinceNoon)

Для исходных данных:

samples = pd.DataFrame(data=[
    [ '2018-10-01 00:00:01' ], [ '2018-10-01 00:00:12' ],
    [ '2018-11-02 01:01:10' ], [ '2018-11-04 03:02:15' ] ],
    columns = ['time']);

при печати результата вы увидите:

                  time   Secs
0  2018-10-01 00:00:01      1
1  2018-10-01 00:00:12     12
2  2018-11-02 01:01:10   3670
3  2018-11-04 03:02:15  10935
0 голосов
/ 20 февраля 2019

Мы можем сделать:

    samples['time'].dt.hour * 3600 + 
    samples['time'].dt.minute * 60 + 
    samples['time'].dt.second
...