datetime dtypes trong pandas read_csv


126

Tôi đang đọc trong tệp csv có nhiều cột ngày giờ. Tôi cần đặt các kiểu dữ liệu khi đọc trong tệp, nhưng lịch ngày có vẻ là một vấn đề. Ví dụ:

headers = ['col1', 'col2', 'col3', 'col4']
dtypes = ['datetime', 'datetime', 'str', 'float']
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

Khi chạy báo lỗi:

TypeError: không hiểu kiểu dữ liệu "datetime"

Chuyển đổi cột sau thực tế, thông qua pandas.to_datetime () không phải là một tùy chọn Tôi không thể biết cột nào sẽ là đối tượng datetime. Thông tin đó có thể thay đổi và đến từ bất cứ thứ gì thông báo cho danh sách dtypes của tôi.

Ngoài ra, tôi đã cố gắng tải tệp csv bằng numpy.genfromtxt, đặt các dtypes trong hàm đó, rồi chuyển đổi thành pandas.dataframe nhưng nó cắt xén dữ liệu. Bất kỳ trợ giúp nào cũng được đánh giá rất cao!

Câu trả lời:


272

Tại sao nó không hoạt động

Không có loại ngày giờ nào được đặt cho read_csv vì tệp csv chỉ có thể chứa chuỗi, số nguyên và số thực.

Đặt một dtype thành datetime sẽ khiến gấu trúc hiểu datetime dưới dạng một đối tượng, nghĩa là bạn sẽ kết thúc bằng một chuỗi.

Gấu trúc cách giải quyết vấn đề này

Các pandas.read_csv()chức năng có một cuộc tranh luận từ khóa gọiparse_dates

Sử dụng điều này, bạn có thể nhanh chóng chuyển đổi chuỗi, số thực hoặc số nguyên thành lịch ngày bằng cách sử dụng default date_parser( dateutil.parser.parser)

headers = ['col1', 'col2', 'col3', 'col4']
dtypes = {'col1': 'str', 'col2': 'str', 'col3': 'str', 'col4': 'float'}
parse_dates = ['col1', 'col2']
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes, parse_dates=parse_dates)

Điều này sẽ khiến gấu trúc đọc col1col2dưới dạng chuỗi, mà chúng rất có thể là ("2016-05-05", v.v.) và sau khi đọc chuỗi, date_parser cho mỗi cột sẽ hoạt động dựa trên chuỗi đó và trả lại bất kỳ thứ gì mà hàm trả về .

Xác định chức năng phân tích cú pháp ngày của riêng bạn:

Các pandas.read_csv()chức năng cũng có một đối số từ khóa gọidate_parser

Đặt điều này thành một hàm lambda sẽ làm cho hàm cụ thể đó được sử dụng để phân tích ngày tháng.

CẢNH BÁO GOTCHA

Bạn phải cung cấp cho nó chức năng chứ không phải thực thi chức năng, do đó điều này là Đúng

date_parser = pd.datetools.to_datetime

Điều này không chính xác :

date_parser = pd.datetools.to_datetime()

Pandas 0.22 Cập nhật

pd.datetools.to_datetime đã được chuyển đến date_parser = pd.to_datetime

Cảm ơn @stackoverYC


1
@Drake Tôi nghĩ rằng user3221055 không bao giờ thực sự quay lại trang web. Đó chính là vấn đề. Hồ sơ cho biết "
Nhìn

2
Đây là một giải pháp chậm. Xem này thay vì: stackoverflow.com/questions/29882573/...
user1761806

@ user1761806 Chào bạn! Tôi đã làm một cái tốt hơn mặc dù. stackoverflow.com/a/46183514/3730397
firelynx

2
Trên pandas 0.22.0 nói rằng pandas.core.datetools.to_datetimekhông được dùng nữa, hãy sử dụng pd.datetools.to_datetimethay thế. như thế này:date_parser = pd.to_datetime
stackoverYC

1
Ngoài ra còn có một converterstham số mà bạn có thể chỉ định cột nào có bộ chuyển đổi nào. parse_dates hữu ích và xử lý dữ liệu xấu nhưng chậm hơn do nó đang kiểm tra và suy ra từng giá trị gist.github.com/gjreda/7433f5f70299610d9b6b
Davos

31

Có một parse_datestham số cho read_csvphép bạn xác định tên của các cột bạn muốn được coi là ngày tháng hoặc thời gian:

date_cols = ['col1', 'col2']
pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=date_cols)

Tôi đã gặp lỗi khi chuyển tên chuỗi đơn của cột, bây giờ tôi hiểu rằng tôi cũng cần chuyển danh sách cho một giá trị duy nhất.
TapanHP

15

Bạn có thể thử chuyển các loại thực tế thay vì các chuỗi.

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime, datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

Nhưng sẽ rất khó để chẩn đoán điều này nếu không có bất kỳ dữ liệu nào của bạn để sửa đổi.

Và thực sự, bạn có thể muốn gấu trúc phân tích ngày tháng thành TimeStamps, vì vậy đó có thể là:

pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=True)

7

Tôi đã thử sử dụng tùy chọn dtypes = [datetime, ...], nhưng

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime, datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

Tôi gặp lỗi sau:

TypeError: data type not understood

Thay đổi duy nhất tôi phải thực hiện là thay datetime bằng datetime.datetime

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime.datetime, datetime.datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

3
Đây vẫn sẽ làm cho dtype của kết quả dataframe một đối tượng, không phải là một pandas.datetime
firelynx

11
Ngoài thực tế là điều này không có hiệu quả mong muốn, nó cũng không hoạt động:AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
Gabriel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.