2016-02-24 12 views
7

Mam dataframe pandy z ponad 1000 znaczników czasu (poniżej), że chciałbym pętli:Dzielenie timestamp kolumna do daty i czasu oddzielnych kolumnach

2016-02-22 14:59:44.561776 

Mam twardy podział czasu tym razem skarbowej w 2 kolumny - "data" i "czas". Format daty może pozostać taki sam, ale czas musi zostać przekonwertowany na CST (w tym milisekundy).

Dzięki za pomoc

+1

Co powiedzieliśmy na '' 2016-02-22 14: 59: 44.561776'.split() '? –

+0

Dlaczego, na Boga, chcesz to zrobić?!? – Alexander

Odpowiedz

9

Nie jestem pewien, dlaczego chcesz to zrobić w pierwszej kolejności, ale jeśli naprawdę musi ...

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 

Konwersja do CST jest trudniejsza. Zakładam, że obecne sygnatury czasowe są "nieświadome", tj. Nie mają załączonej strefy czasowej? Jeśli nie, jak można by je przekonwertować?

Szczegółowe informacje:

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

How to make an unaware datetime timezone aware in python

EDIT

Alternatywny sposób, że tylko jeden raz po drugiej stronie pętelki do znaczników czasu zamiast dwukrotnego:

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

Tego właśnie szukam. Teraz dostaję ten błąd: AttributeError: "str" ​​obiekt nie ma atrybutu "date". Muszę je rozdzielić, ponieważ próbuję przekazać wartości do innego skryptu, którego nie napisałem - i to jest format, którego używał. – Tom

+0

Oznacza to, że dane są sformatowane jako ciągi zamiast znaczników czasu. Wypróbuj 'pd.to_datetime (df.my_timestamp)', aby sprawdzić, czy to konwertuje poprawnie. – Alexander

+0

Ten sam błąd jak powyżej. Jednak gdy wypróbowałem jedną z innych sugestii innego użytkownika, otrzymałem błąd "Serii" zamiast "str". Dlaczego miałoby to być? – Tom

0

Spróbuj

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

date,time = s.split() 

następnie przekonwertować czasu, ile potrzeba.

Jeśli chcesz dalej podzielić czas

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

spróbuj tego:

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

Jeśli znaczniki czasu są już w formacie Pandy (nie string), a następnie:

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

Jeśli znacznik czasu jest ciągiem znaków, można analizować je za pomocą modułu datetime:

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

Źródło: http://pandas.pydata.org/pandas-docs/stable/timeseries.html

1

Jeśli znacznik czasu jest ciągiem znaków, można przekonwertować go do datetime obiektu:

from datetime import datetime 

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

Od tego momentu możesz go dostosować do dowolnego formatu.

3

Myślę, że najłatwiej jest użyć atrybutu pandy serii . Na twoim przypadku trzeba użyć dt.date i 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

Miał ten sam problem i to pracował dla mnie.

Załóżmy kolumna data w zbiorze danych nazywany jest „data”

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 

To daje dwie kolumny „randek” i „Time” z datami splited.

Powiązane problemy