2014-12-16 30 views
13

Xin lỗi trước cho việc này, nhưng sau hai giờ tìm kiếm và thử tôi không thể nhận được câu trả lời đúng ở đây. Tôi có một khung dữ liệu, được điền thông qua pandas io sql.read_frame(). Cột được chứng minh là quá nhiều đối với tôi là dtypeint64. Các số nguyên có định dạng YYYYMMDD. ví dụ 20070530 - 30 tháng năm 2007. Tôi đã thử một loạt các cách tiếp cận, rõ ràng nhất là;Số nguyên pandas Python YYYYMMDD đến datetime

pd.to_datetime(dt['Date'])pd.to_datetime(str(dt['Date']))

với nhiều biến thể về chức năng các thông số khác nhau.

Kết quả là tốt nhất là ngày được hiểu là thời gian. Ngày được đặt thành 1970-01-01 - kết quả theo ví dụ trên 1970-01-01 00:00:00.020070530

Tôi cũng đã thử các chức năng khác nhau .map() được tìm thấy trong các bài đăng mô phỏng.

Tôi nhận thấy rằng theo np.date_range() có thể giải thích giá trị chuỗi của định dạng YYYYMMDD, nhưng đó là gần nhất tôi đã đến để xem giải pháp.

Nếu có ai có câu trả lời, tôi sẽ rất tuyệt vời!

EDIT: Theo quan điểm của câu trả lời từ Ed Chum, vấn đề rất có thể liên quan đến mã hóa. rep() trên một tập hợp con của sản lượng dataFrame:

OrdNo LstInvDt \ n0
9 20.070.620 \ n1
11 20.070.830 \ n2
19 20.070.719 \ n3
21 20.070.719 \ n4
23 20.070.719 \ n5
26 20.070.911 \ n7
29 20.070.918 \ n8
31 0.070.816 \ n9
34 20.070.925 \ N10

Đây là khi LstInvDt là dtype int64.

+2

'to_datetime' chấp nhận một chuỗi định dạng để' pd.to_datetime (str (t), format = '% Y% m% d') 'sẽ hoạt động:' Trong [92]: t = 20070530 pd.to_datetime (str (t), format = '% Y% m % d ') Out [92]: Dấu thời gian (' 2007-05-30 00:00:00 ') ' – EdChum

+0

Thành thật mà nói tôi nghĩ đó là' uff-8', nhưng rõ ràng có điều gì đó đang xảy ra mà tôi không nhận thức được. Tôi sẽ phải nhìn vào phần nhập khẩu sql một lần nữa ... Cảm ơn bạn đã giúp đỡ của bạn @EdChum. Bạn đã trả lời câu hỏi của tôi, vì vậy tôi sẽ kiểm tra câu trả lời của bạn như được chấp nhận. Có vẻ như tôi sẽ sử dụng hầu hết ngày hôm nay để tìm ra cái này ... – Rookie

+0

Có vẻ như tôi giống như nhân vật dòng mới không bị tước bỏ nhưng có một chút bối rối ở đâu/tại sao bạn dường như có một chỉ số theo sau nó, Tôi muốn so sánh với những gì được lưu trữ trong DB của bạn và so sánh với xuất khẩu ra csv – EdChum

Trả lời

26

to_datetime chấp nhận một chuỗi định dạng:

In [92]: 

t = 20070530 
pd.to_datetime(str(t), format='%Y%m%d') 
Out[92]: 
Timestamp('2007-05-30 00:00:00') 

dụ:

In [94]: 

t = 20070530 
df = pd.DataFrame({'date':[t]*10}) 
df 
Out[94]: 
     date 
0 20070530 
1 20070530 
2 20070530 
3 20070530 
4 20070530 
5 20070530 
6 20070530 
7 20070530 
8 20070530 
9 20070530 
In [98]: 

df['DateTime'] = df['date'].apply(lambda x: pd.to_datetime(str(x), format='%Y%m%d')) 
df 
Out[98]: 
     date DateTime 
0 20070530 2007-05-30 
1 20070530 2007-05-30 
2 20070530 2007-05-30 
3 20070530 2007-05-30 
4 20070530 2007-05-30 
5 20070530 2007-05-30 
6 20070530 2007-05-30 
7 20070530 2007-05-30 
8 20070530 2007-05-30 
9 20070530 2007-05-30 
In [99]: 

df.dtypes 
Out[99]: 
date     int64 
DateTime datetime64[ns] 
dtype: object 

EDIT

Trên thực tế nó là nhanh hơn để chuyển đổi kiểu chuỗi và sau đó chuyển đổi toàn bộ loạt đến một ngày giờ thay vì gọi áp dụng trên mọi giá trị:

In [102]: 

df['DateTime'] = pd.to_datetime(df['date'].astype(str), format='%Y%m%d') 
df 
Out[102]: 
     date DateTime 
0 20070530 2007-05-30 
1 20070530 2007-05-30 
2 20070530 2007-05-30 
3 20070530 2007-05-30 
4 20070530 2007-05-30 
5 20070530 2007-05-30 
6 20070530 2007-05-30 
7 20070530 2007-05-30 
8 20070530 2007-05-30 
9 20070530 2007-05-30 

timings

In [104]: 

%timeit df['date'].apply(lambda x: pd.to_datetime(str(x), format='%Y%m%d')) 

100 loops, best of 3: 2.55 ms per loop 
In [105]: 

%timeit pd.to_datetime(df['date'].astype(str), format='%Y%m%d') 
1000 loops, best of 3: 396 µs per loop 
+0

Cảm ơn bạn đã trả lời nhanh chóng @EdChum Đó là một câu trả lời tốt. Lý do nó không làm việc cho tôi, có vẻ là một vấn đề mã hóa; 'dữ liệu thời gian '0 20070620 \ n1 20070830 \ n2 20070719 \ n3 20070719 \ n4 20070719 \ n5 20080227 \ n6 20070911 \ n7 20070918 \ n8 20070816 \ n9 20070925 \ n10 20070719 \ n11 20070725 \ n12 Tên: LstInvDt, Chiều dài: 17252, dtype : int64 'không khớp với định dạng'% Y% m% d'' – Rookie

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