2016-02-24 4 views
7

у меня есть панд dataframe с более чем 1000 меток времени (ниже), что я хотел бы Переберите:Расщепление столбец временной метки на отдельные даты и времени столбцов

2016-02-22 14:59:44.561776 

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

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

+1

Как насчет ''2016-02-22 14: 59: 44.561776'.split()'? –

+0

Почему бы вам это сделать?!? – Alexander

ответ

9

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

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 

Конверсия в КНТ более сложна. Я предполагаю, что текущие временные метки «не знают», т. Е. У них нет привязки к часовому поясу? Если нет, как бы вы ожидали их преобразования?

Для получения более подробной информации:

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

How to make an unaware datetime timezone aware in 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) 
+0

Это то, что я ищу. Я получаю эту ошибку прямо сейчас: AttributeError: объект 'str' не имеет атрибута 'date'. Мне нужно, чтобы они разделились, потому что я пытаюсь передать значения другому сценарию, который я не писал, и это тот формат, который он использовал. – Tom

+0

Это означает, что ваши данные форматируются как строки вместо временных меток. Попробуйте 'pd.to_datetime (df.my_timestamp)', чтобы проверить, правильно ли оно преобразует его. – Alexander

+0

Та же ошибка, что и выше. Однако, когда я попробовал одно из других предложений от другого пользователя, у меня появилась ошибка «Series» вместо str. Почему это так? – Tom

0

Попробуйте

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

date,time = s.split() 

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

Если вы хотите еще больше расколоть время,

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

попробовать это:

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

Если временные метки уже в формате панд (не строки), то:

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

1

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

from datetime import datetime 

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

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

3

Я думаю, самый простой способ - использовать атрибут dt серии pandas. В вашем случае вы должны использовать 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 
0

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

Пусть столбец даты в наборе данных называется «дата»

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 

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

Смежные вопросы