Разделение столбца метки времени на отдельные столбцы даты и времени

У меня есть pandas датафрейм с более чем 1000 временными метками (ниже), которые я хотел бы пропустить:

2016-02-22 14:59:44.561776

Мне сложно разбивать этот штамп времени на 2 столбца - "дата" и "время". Формат даты может оставаться неизменным, но время должно быть преобразовано в CST (включая миллисекунды).

Спасибо за помощь

Ответ 1

Я не уверен, почему вы хотели бы сделать это в первую очередь, но если вы действительно должны...

df = pd.DataFrame({'my_timestamp': pd.date_range('2016-1-1 15:00', periods=5)})

>>> df
         my_timestamp
0 2016-01-01 15:00:00
1 2016-01-02 15:00:00
2 2016-01-03 15:00:00
3 2016-01-04 15:00:00
4 2016-01-05 15:00:00

df['new_date'] = [d.date() for d in df['my_timestamp']]
df['new_time'] = [d.time() for d in df['my_timestamp']]

>>> df
         my_timestamp    new_date  new_time
0 2016-01-01 15:00:00  2016-01-01  15:00:00
1 2016-01-02 15:00:00  2016-01-02  15:00:00
2 2016-01-03 15:00:00  2016-01-03  15:00:00
3 2016-01-04 15:00:00  2016-01-04  15:00:00
4 2016-01-05 15:00:00  2016-01-05  15:00:00

Конвертация в CST более сложная. Я предполагаю, что текущие временные метки не известны, то есть к ним не прикреплен часовой пояс? Если нет, как бы вы ожидали их конвертировать?

Больше подробностей:

https://docs.python.org/2/library/datetime.html

Как сделать незнакомый часовой пояс даты и времени в Python

РЕДАКТИРОВАТЬ

Альтернативный метод, который зацикливается только один раз на отметках времени вместо двух:

new_dates, new_times = zip(*[(d.date(), d.time()) for d in df['my_timestamp']])
df = df.assign(new_date=new_dates, new_time=new_times)

Ответ 2

Я думаю, что самый простой способ - использовать атрибут dt серии Панд. Для вашего случая вам нужно использовать dt.date и dt.time:

df = pd.DataFrame({'full_date': pd.date_range('2016-1-1 10:00:00.123', periods=10, freq='5H')})
df['date'] = df['full_date'].dt.date
df['time'] = df['full_date'].dt.time

In [166]: df
Out[166]:
                full_date        date             time
0 2016-01-01 10:00:00.123  2016-01-01  10:00:00.123000
1 2016-01-01 15:00:00.123  2016-01-01  15:00:00.123000
2 2016-01-01 20:00:00.123  2016-01-01  20:00:00.123000
3 2016-01-02 01:00:00.123  2016-01-02  01:00:00.123000
4 2016-01-02 06:00:00.123  2016-01-02  06:00:00.123000
5 2016-01-02 11:00:00.123  2016-01-02  11:00:00.123000
6 2016-01-02 16:00:00.123  2016-01-02  16:00:00.123000
7 2016-01-02 21:00:00.123  2016-01-02  21:00:00.123000
8 2016-01-03 02:00:00.123  2016-01-03  02:00:00.123000
9 2016-01-03 07:00:00.123  2016-01-03  07:00:00.123000

Ответ 3

Была такая же проблема, и это сработало для меня.

Предположим, что столбец даты в вашем наборе данных называется "дата"

import pandas as pd
df = pd.read_csv(file_path)

df['Dates'] = pd.to_datetime(df['date']).dt.date
df['Time'] = pd.to_datetime(df['date']).dt.time

Это даст вам два столбца "Даты" и "Время" с расщепленными датами.

Ответ 4

Если ваши метки времени уже находятся в формате pandas (не строка), то:

df["date"] = df["timestamp"].date
dt["time"] = dt["timestamp"].time

Если ваша временная метка является строкой, ее можно проанализировать с помощью модуля datetime:

from datetime import datetime
data1["timestamp"] = df["timestamp"].apply(lambda x: \
    datetime.strptime(x,"%Y-%m-%d %H:%M:%S.%f"))

Источник: http://pandas.pydata.org/pandas-docs/stable/timeseries.html

Ответ 5

Если ваша временная метка является строкой, вы можете преобразовать ее в объект datetime:

from datetime import datetime

timestamp = '2016-02-22 14:59:44.561776'
dt = datetime.strptime(timestamp, '%Y-%m-%d %H:%M:%S.%f')

С этого момента вы можете принести его в любой формат, который вам нравится.

Ответ 6

Try

s = '2016-02-22 14:59:44.561776'

date,time = s.split()

затем преобразуйте время по мере необходимости.

Если вы хотите еще раз разделить время,

hour, minute, second = time.split(':')

Ответ 7

попробуйте следующее:

def time_date(datetime_obj):
    date_time = datetime_obj.split(' ')
    time = date_time[1].split('.')
    return date_time[0], time[0]