2013-05-07 49 views
22

Tôi có một DataFrame với cột có tên date. Làm cách nào để chúng tôi có thể chuyển đổi/phân tích cú pháp cột 'ngày' thành đối tượng DateTime?Phân tích cú pháp cột Gấu trúc thành Ngày giờ

Tôi đã tải cột ngày từ cơ sở dữ liệu Postgresql bằng cách sử dụng sql.read_frame(). Ví dụ về cột date2013-04-04.

Điều tôi đang cố gắng làm là chọn tất cả các hàng trong một khung dữ liệu có cột ngày của chúng trong một khoảng thời gian nhất định, như sau 2013-04-01 và trước 2013-04-04.

nỗ lực của tôi dưới đây cung cấp cho các lỗi 'Series' object has no attribute 'read'

Cố gắng

import dateutil 

df['date'] = dateutil.parser.parse(df['date']) 

Lỗi

AttributeError       Traceback (most recent call last) 
<ipython-input-636-9b19aa5f989c> in <module>() 
    15 
    16 # Parse 'Date' Column to Datetime 
---> 17 df['date'] = dateutil.parser.parse(df['date']) 
    18 
    19 # SELECT RECENT SALES 

C:\Python27\lib\site-packages\dateutil\parser.pyc in parse(timestr, parserinfo, **kwargs) 
    695   return parser(parserinfo).parse(timestr, **kwargs) 
    696  else: 
--> 697   return DEFAULTPARSER.parse(timestr, **kwargs) 
    698 
    699 

C:\Python27\lib\site-packages\dateutil\parser.pyc in parse(self, timestr, default, ignoretz, tzinfos, **kwargs) 
    299    default = datetime.datetime.now().replace(hour=0, minute=0, 
    300              second=0, microsecond=0) 
--> 301   res = self._parse(timestr, **kwargs) 
    302   if res is None: 
    303    raise ValueError, "unknown string format" 

C:\Python27\lib\site-packages\dateutil\parser.pyc in _parse(self, timestr, dayfirst, yearfirst, fuzzy) 
    347    yearfirst = info.yearfirst 
    348   res = self._result() 
--> 349   l = _timelex.split(timestr) 
    350   try: 
    351 

C:\Python27\lib\site-packages\dateutil\parser.pyc in split(cls, s) 
    141 
    142  def split(cls, s): 
--> 143   return list(cls(s)) 
    144  split = classmethod(split) 
    145 

C:\Python27\lib\site-packages\dateutil\parser.pyc in next(self) 
    135 
    136  def next(self): 
--> 137   token = self.get_token() 
    138   if token is None: 
    139    raise StopIteration 

C:\Python27\lib\site-packages\dateutil\parser.pyc in get_token(self) 
    66     nextchar = self.charstack.pop(0) 
    67    else: 
---> 68     nextchar = self.instream.read(1) 
    69     while nextchar == '\x00': 
    70      nextchar = self.instream.read(1) 

AttributeError: 'Series' object has no attribute 'read' 

df['date'].apply(dateutil.parser.parse) mang lại cho tôi lỗi AttributeError: 'datetime.date' object has no attribute 'read'

df['date'].truncate(after='2013/04/01') cung cấp cho các lỗi TypeError: can't compare datetime.datetime to long

df['date'].dtype lợi nhuận dtype('O'). Nó đã là một đối tượng datetime?

+1

Vui lòng đăng ví dụ về nội dung nào đó trong cột 'ngày' của bạn! Bởi vì gấu trúc nên thực sự nhận ra một đối tượng datetime, vì vậy sẽ rất có ích khi xem định dạng thực tế cho cột đó –

+0

@RyanSaxe Tôi đã nạp cột ngày tháng từ cơ sở dữ liệu Postgresql bằng cách sử dụng 'sql.read_frame()'. Ví dụ về cột 'ngày' là' 2013-04-04'. Làm thế nào để bạn kiểm tra dtype của một cột? – Nyxynyx

+0

'df ['date']. Dtype' trả về' dtype ('O') ' – Nyxynyx

Trả lời

4

gấu trúc đã đọc là đối tượng datetime! Vì vậy, những gì bạn muốn là để chọn hàng giữa hai ngày và bạn có thể làm điều đó bằng mặt nạ:

df_masked = df[(df.date > '2012-04-01') & (df.date < '2012-04-04')] 

Bởi vì bạn nói rằng bạn đang nhận được một lỗi từ chuỗi đối với một số lý do, hãy thử này:

df_masked = df[(df.date > datetime.date(2012,4,1)) & (df.date < datetime.date(2012,4,4))] 
+1

'df = df [df.date> '2012-01-01']' cho tôi một lỗi 'TypeError: không thể so sánh datetime.date với str'. – Nyxynyx

+1

Tôi sử dụng tất cả các thời gian! Điều đó rất kỳ quặc ... câu hỏi của bạn rất giống với câu hỏi mà tôi đã hỏi và tôi đã nhận được câu trả lời này và nó đã hoạt động. [Xem tại đây] (http://stackoverflow.com/questions/16341367/grabbing-selection-between-specific-dates-in-a-dataframe) –

+0

Có .. nó hoạt động khi tôi tạo khung dữ liệu theo cách thủ công ... nhưng nếu tôi tạo dataframe từ một cơ sở dữ liệu SQL bằng cách sử dụng 'sql.read_frame',' '2012-01-01'' được coi là một chuỗi? – Nyxynyx

2

Bạn có lẽ cần apply, vì vậy cái gì đó như:

df['date'] = df['date'].apply(dateutil.parser.parse) 

Nếu không có một ví dụ về cột tôi không thể đảm bảo này sẽ làm việc, nhưng một cái gì đó theo hướng đó sẽ giúp bạn để tiếp tục.

+0

Cảm ơn, tôi đã thử' df ['date']. Áp dụng (dateutil.parser.parse) 'và nó đưa ra lỗi ethe.Đối tượng 'AttributeError: 'datetime.date' không có thuộc tính 'read''. Ví dụ về cột là '2013-04-04'. Toàn bộ khung dữ liệu đã được tải từ một cơ sở dữ liệu PostgreSQL bằng cách sử dụng 'sql.readframe()'. – Nyxynyx

1

Bạn nên lặp lại các mục và phân tích chúng một cách độc lập, sau đó tạo danh sách mới.

df['date'] = [dateutil.parser.parse(x) for x in df['date']] 
44

Pandas biết về đối tượng datetime nhưng khi bạn sử dụng một số chức năng nhập được lấy làm chuỗi. Vì vậy, những gì bạn cần làm là đảm bảo cột được đặt làm loại ngày giờ không phải là một chuỗi. Sau đó, bạn có thể thực hiện truy vấn của mình.

df['date'] = pd.to_datetime(df['date']) 
df_masked = df[(df['date'] > datetime.date(2012,4,1)) & (df['date'] < datetime.date(2012,4,4))] 
Các vấn đề liên quan