dtypes วันที่และเวลาในแพนด้า read_csv


128

ฉันกำลังอ่านในไฟล์ csv ที่มีคอลัมน์วันที่และเวลาหลายคอลัมน์ ฉันต้องตั้งค่าประเภทข้อมูลเมื่ออ่านในไฟล์ แต่เวลาที่เกิดขึ้นดูเหมือนจะมีปัญหา ตัวอย่างเช่น:

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

เมื่อรันให้ข้อผิดพลาด:

TypeError: ไม่เข้าใจประเภทข้อมูล "datetime"

การแปลงคอลัมน์ตามความเป็นจริงผ่าน pandas.to_datetime () ไม่ใช่ตัวเลือกที่ฉันไม่รู้ว่าคอลัมน์ใดจะเป็นวัตถุวันที่และเวลา ข้อมูลนั้นสามารถเปลี่ยนแปลงได้และมาจากสิ่งที่แจ้งรายการ dtypes ของฉัน

หรือฉันพยายามโหลดไฟล์ csv ด้วย numpy.genfromtxt ตั้งค่า dtypes ในฟังก์ชั่นนั้นแล้วแปลงเป็น pandas.dataframe แต่มันกลับรวบรวมข้อมูล ความช่วยเหลือใด ๆ ที่ได้รับการชื่นชมอย่างมาก!

คำตอบ:


274

ทำไมมันไม่ทำงาน

ไม่มีประเภทวันที่และเวลาที่จะตั้งค่าสำหรับ read_csv เนื่องจากไฟล์ csv สามารถมีได้เฉพาะสตริงจำนวนเต็มและการลอยเท่านั้น

การตั้งค่า dtype เป็นวันที่และเวลาจะทำให้แพนด้าตีความวันที่และเวลาเป็นวัตถุซึ่งหมายความว่าคุณจะจบลงด้วยสตริง

วิธีแก้ปัญหาของนุ่น

pandas.read_csv()ฟังก์ชั่นที่มีการโต้แย้งคำหลักที่เรียกว่าparse_dates

การใช้สิ่งนี้คุณสามารถแปลงสตริงลอยหรือจำนวนเต็มเป็นวันที่ได้ทันทีโดยใช้ค่าเริ่มต้น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)

สิ่งนี้จะทำให้แพนด้าอ่านcol1และcol2เป็นสตริงซึ่งมักจะเป็น ("2016-05-05" เป็นต้น) และหลังจากอ่านสตริงแล้ว date_parser สำหรับแต่ละคอลัมน์จะทำงานกับสตริงนั้นและให้สิ่งที่ฟังก์ชันนั้นคืนกลับมา .

การกำหนดฟังก์ชันการแยกวิเคราะห์วันที่ของคุณเอง:

pandas.read_csv()ฟังก์ชั่นนอกจากนี้ยังมีข้อโต้แย้งคำหลักที่เรียกว่าdate_parser

การตั้งค่านี้เป็นฟังก์ชันแลมบ์ดาจะทำให้ฟังก์ชันเฉพาะนั้นถูกใช้สำหรับการแยกวิเคราะห์วันที่

คำเตือน GOTCHA

คุณต้องให้ฟังก์ชั่นไม่ใช่การเรียกใช้ฟังก์ชันนี้จึงถูกต้อง

date_parser = pd.datetools.to_datetime

สิ่งนี้ไม่ถูกต้อง :

date_parser = pd.datetools.to_datetime()

อัปเดต Pandas 0.22

pd.datetools.to_datetime ถูกย้ายไปที่ date_parser = pd.to_datetime

ขอบคุณ @stackoverYC


1
@Drake ฉันคิดว่า user3221055 ไม่เคยกลับมาที่ไซต์จริงๆ นั่นคือปัญหา. โปรไฟล์ระบุว่า "ดูล่าสุดเมื่อวันที่ 20
2557

2
นี่เป็นการแก้ปัญหาอย่างช้าๆ ดูสิ่งนี้แทน: stackoverflow.com/questions/29882573/…
user1761806

@ user1761806 สวัสดีพบ! ฉันทำให้ดีขึ้นแม้ว่า stackoverflow.com/a/46183514/3730397
firelynx

2
บนแพนด้า 0.22.0 บอกว่าpandas.core.datetools.to_datetimeเลิกใช้แล้วให้ใช้pd.datetools.to_datetimeแทน ดังนี้:date_parser = pd.to_datetime
stackoverYC

1
นอกจากนี้ยังมีconvertersพารามิเตอร์ที่คุณสามารถระบุได้ว่าคอลัมน์ใดมีตัวแปลงใดบ้าง parse_dates มีประโยชน์และจัดการกับข้อมูลที่ไม่ดี แต่ช้ากว่าเนื่องจากมีการทดสอบและอนุมานแต่ละค่าgist.github.com/gjreda/7433f5f70299610d9b6b
Davos

31

มีparse_datesพารามิเตอร์read_csvที่ช่วยให้คุณกำหนดชื่อของคอลัมน์ที่คุณต้องการให้ถือว่าเป็นวันที่หรือวันที่:

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

ฉันมีข้อผิดพลาดขณะที่ฉันกำลังส่งชื่อสตริงเดี่ยวของคอลัมน์ตอนนี้ฉันเข้าใจว่าฉันต้องส่งผ่านรายการสำหรับค่าเดียวด้วย
TapanHP

15

คุณอาจลองส่งประเภทจริงแทนสตริง

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)

แต่มันจะยากมากที่จะวินิจฉัยสิ่งนี้โดยไม่มีข้อมูลของคุณให้คนจรจัดด้วย

และจริงๆแล้วคุณอาจต้องการให้แพนด้าแยกวิเคราะห์วันที่ลงใน TimeStamps ดังนั้นอาจเป็น:

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

7

ฉันลองใช้ตัวเลือก dtypes = [datetime, ... ] แต่

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)

ฉันพบข้อผิดพลาดต่อไปนี้:

TypeError: data type not understood

การเปลี่ยนแปลงเดียวที่ฉันต้องทำคือแทนที่วันที่และเวลาด้วย 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
สิ่งนี้จะยังคงทำให้ dtype ของ dataframe ที่เป็นผลลัพธ์เป็นวัตถุไม่ใช่ pandas.datetime
firelynx

11
นอกเหนือจากข้อเท็จจริงที่ว่าสิ่งนี้ไม่ได้ผลตามที่ต้องการมันยังใช้ไม่ได้:AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
กาเบรียล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.