2016-02-24 23 views
7

Tôi có một dataframe gấu trúc với hơn 1000 timestamps (dưới đây) mà tôi muốn để lặp qua:Chia thành các cột ngày và thời gian riêng biệt

2016-02-22 14:59:44.561776 

Tôi đang gặp một thời gian tách cứng tem thời gian này thành 2 cột - 'ngày' và 'thời gian'. Định dạng ngày có thể giữ nguyên, nhưng thời gian cần được chuyển đổi thành CST (bao gồm mili giây).

Thanks for the help

+1

Làm thế nào về ''2016-02-22 14: 59: 44.561776'.split()'? –

+0

Tại sao bạn muốn làm điều đó?!? – Alexander

Trả lời

9

Tôi không chắc chắn lý do tại sao bạn sẽ muốn làm điều này ở nơi đầu tiên, nhưng nếu bạn thực sự phải ...

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 

Việc chuyển đổi sang CST khó khăn hơn. Tôi cho rằng các dấu thời gian hiện tại là 'không biết', tức là chúng không có múi giờ kèm theo? Nếu không, làm thế nào bạn mong đợi để chuyển đổi chúng?

Để biết thêm chi tiết:

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

How to make an unaware datetime timezone aware in python

EDIT

Một phương pháp thay thế mà chỉ vòng một lần trên timestamps thay vì hai lần:

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

Đây là những gì tôi đang tìm kiếm. Tôi nhận được lỗi này ngay bây giờ mặc dù: AttributeError: 'str' đối tượng không có thuộc tính 'ngày'. Tôi cần phải có được những tách ra bởi vì tôi đang cố gắng để vượt qua các giá trị cho một kịch bản mà tôi đã không viết-và đây là định dạng ông đã sử dụng. – Tom

+0

Điều đó có nghĩa là dữ liệu của bạn được định dạng dưới dạng chuỗi thay vì dấu thời gian. Hãy thử 'pd.to_datetime (df.my_timestamp)' để xem điều đó có chuyển đổi đúng hay không. – Alexander

+0

Lỗi tương tự như trên. Tuy nhiên, khi tôi đã thử một trong những gợi ý khác từ một người dùng khác, tôi gặp lỗi 'Series' thay cho str. Tại sao lại thế? – Tom

0

Hãy thử

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

date,time = s.split() 

sau đó chuyển đổi thời gian khi cần thiết.

Nếu bạn muốn chia thêm thời gian,

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

thử điều này:

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

Nếu timestamps bạn đã có trong định dạng gấu trúc (không dây), sau đó:

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

Nếu timestamp của bạn là một chuỗi, bạn có thể phân tích nó bằng cách sử dụng mô-đun datetime:

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

Nguồn: http://pandas.pydata.org/pandas-docs/stable/timeseries.html

1

Nếu timestamp của bạn là một chuỗi, bạn có thể chuyển nó sang một đối tượng datetime:

from datetime import datetime 

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

Từ đó bạn có thể mang đến bất kỳ định dạng nào bạn thích.

3

Tôi nghĩ cách dễ nhất là sử dụng thuộc tính dt của chuỗi gấu trúc. Đối với trường hợp của bạn, bạn cần phải sử dụng dt.datedt.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

Đã cùng một vấn đề và điều này đã làm việc cho tôi.

Giả sử cột ngày trong tập dữ liệu của bạn được gọi là "ngày"

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 

này sẽ cung cấp cho bạn hai cột "Ngày" và "Thời gian" với số ngày tách ra.

Các vấn đề liên quan