2016-02-24 18 views
7

ho un dataframe panda con oltre 1000 timestamp (sotto) che vorrei collegare attraverso:frazionamento in data e ora separati colonne

2016-02-22 14:59:44.561776 

Sto avendo un momento difficile scissione questa volta stamp in 2 colonne: "data" e "ora". Il formato della data può rimanere lo stesso, ma il tempo deve essere convertito in CST (compresi i millisecondi).

Grazie per l'aiuto

+1

Come su ''2016-02-22 14: 59: 44.561776'.split()'? –

+0

Perché mai vorresti farlo?!? – Alexander

risposta

9

io non sono sicuro perché si vuole fare questo, in primo luogo, ma se si davvero deve ...

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 

La conversione in CST è più complicata. Presumo che i timestamp correnti siano "inconsapevoli", cioè non hanno un fuso orario allegato? In caso contrario, come ti aspetteresti di convertirli?

Per ulteriori dettagli:

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

How to make an unaware datetime timezone aware in python

EDIT

Un metodo alternativo che loop sola volta tutti i timestamp anziché due:

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

Questo è quello che sto cercando. Sto ricevendo questo errore adesso: AttributeError: l'oggetto 'str' non ha attributo 'date'. Devo separarli perché sto cercando di passare i valori a un altro script che non ho scritto, e questo è il formato che ha usato. – Tom

+0

Ciò significa che i tuoi dati sono formattati come stringhe invece di timestamp. Prova 'pd.to_datetime (df.my_timestamp)' per vedere se lo converte correttamente. – Alexander

+0

Stesso errore di sopra. Tuttavia, quando ho provato uno degli altri suggerimenti di un altro utente, ho ricevuto un errore "Series" al posto dello str. Perché dovrebbe essere? – Tom

0

Prova

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

date,time = s.split() 

poi convertire il tempo in base alle esigenze.

Se si desidera dividere ulteriormente il tempo,

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

provare questo:

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

Se i timestamp sono già in formato panda (non stringa), quindi:

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

Se il timestamp è una stringa, è possibile analizzare utilizzando il modulo datetime:

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

Fonte: http://pandas.pydata.org/pandas-docs/stable/timeseries.html

1

Se il timestamp è una stringa, è possibile convertirlo in un oggetto datetime:

from datetime import datetime 

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

Da quel momento in poi puoi portarlo nel formato che preferisci.

3

Penso che il modo più semplice sia utilizzare l'attributo dt della serie panda. Per il vostro caso è necessario utilizzare dt.date e 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

Aveva lo stesso problema e questo ha funzionato per me.

Supponiamo la colonna della data nel vostro set di dati si chiama "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 

Questo vi darà due colonne "Date" e "Time" con date splited.