Pandalar read_csv'deki datetime dtypes


127

Birden çok tarih saat sütunu olan bir csv dosyasında okuyorum. Dosyayı okurken veri türlerini ayarlamam gerekir, ancak veri zamanları bir sorun gibi görünüyor. Örneğin:

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

Çalıştırma bir hata verdiğinde:

TypeError: "datetime" veri türü anlaşılmadı

Bundan sonra sütunları pandas.to_datetime () aracılığıyla dönüştürmek, hangi sütunların datetime nesneleri olacağını bilemediğim bir seçenek değil. Bu bilgi değişebilir ve dtypes listemi bilgilendiren her şeyden gelir.

Alternatif olarak, csv dosyasını numpy.genfromtxt ile yüklemeyi, bu işlevdeki dtype'ları ayarlamayı ve ardından bir pandas.dataframe'e dönüştürmeyi denedim, ancak verileri karıştırıyor. Herhangi bir yardım büyük beğeni topluyor!

Yanıtlar:


273

Neden çalışmıyor

Read_csv için ayarlanacak bir datetime dtype yoktur, çünkü csv dosyaları yalnızca dizeler, tamsayılar ve kayan değerler içerebilir.

Bir dtype'yi datetime olarak ayarlamak, pandaların tarih saati bir nesne olarak yorumlamasına neden olur, bu da bir dizeyle sonuçlanacağınız anlamına gelir.

Pandalar bunu çözmenin yolu

pandas.read_csv()Fonksiyon adı verilen bir anahtar kelime argüman vardırparse_dates

Bunu kullanarak, varsayılan date_parser( dateutil.parser.parser) kullanarak dizeleri, yüzer sayıları veya tam sayıları veri zamanlarına anında dönüştürebilirsiniz.

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)

Bu, pandaların büyük olasılıkla ("2016-05-05" vb.) Dizeleri okumasına col1ve col2dizeler olarak okumasına neden olur ve dizeyi okuduktan sonra, her sütun için tarih_parçası bu dizeye göre hareket eder ve o işlevin döndürdüğü şeyi geri verir. .

Kendi tarih ayrıştırma işlevinizi tanımlama:

pandas.read_csv()Fonksiyon da adlandırılan bir anahtar kelime argüman vardırdate_parser

Bunu bir lambda işlevine ayarlamak, o belirli işlevin tarihlerin ayrıştırılması için kullanılmasını sağlayacaktır.

GOTCHA UYARISI

Ona işlevin yerine getirilmesini değil işlevi vermelisiniz, bu nedenle bu Doğru

date_parser = pd.datetools.to_datetime

Bu yanlış :

date_parser = pd.datetools.to_datetime()

Pandas 0.22 Güncelleme

pd.datetools.to_datetime taşındı date_parser = pd.to_datetime

Teşekkürler @stackoverYC


1
@Drake Bence user3221055 asla siteye geri dönmedi. İşte sorun bu.
Profilde

2
Bu yavaş bir çözüm. Bunun yerine buna bakın: stackoverflow.com/questions/29882573/…
user1761806

@ user1761806 Hey iyi bul! Yine de daha iyisini yaptım. stackoverflow.com/a/46183514/3730397
firelynx

2
Pandalarda 0.22.0 pandas.core.datetools.to_datetimekullanımdan kaldırıldı diyor , pd.datetools.to_datetimebunun yerine kullanın. böyle:date_parser = pd.to_datetime
stackoverYC

1
Ayrıca convertershangi sütunların hangi dönüştürücülere sahip olduğunu belirtebileceğiniz bir parametre de vardır . parse_dates yararlıdır ve kötü verileri işler, ancak her bir değeri test edip çıkarması
Davos

31

Tarihler veya tarihler olarak değerlendirilmesini istediğiniz sütunların adlarını tanımlamanıza izin veren bir parse_datesparametre vardır read_csv:

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

Sütunun tek dize adını geçerken hata yapıyordum, şimdi tek bir değer için de listeyi geçmem gerektiğini anlıyorum.
TapanHP

15

Dizeler yerine gerçek türleri geçirmeyi deneyebilirsiniz.

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)

Ancak, üzerinde çalışabileceğiniz verileriniz olmadan bunu teşhis etmek gerçekten zor olacak.

Ve gerçekten, muhtemelen pandaların tarihleri ​​TimeStamps olarak ayrıştırmasını istersiniz, bu yüzden şunlar olabilir:

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

7

Dtypes = [datetime, ...] seçeneğini kullanmayı denedim, ancak

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)

Aşağıdaki hatayla karşılaştım:

TypeError: data type not understood

Yapmam gereken tek değişiklik, datetime.datetime ile tarih saatini değiştirmektir.

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
Bu, sonuçta ortaya çıkan veri çerçevesinin dtype'ini bir pandas.datetime değil, bir nesne haline getirmeye devam edecek
firelynx

11
Bunun istenen etkiye sahip olmadığı gerçeğinin yanı sıra, işe yaramıyor:AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
Gabriel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.