Разделение столбца метки времени на отдельные столбцы даты и времени
У меня есть 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]