簡體   English   中英

熊貓 read_csv 中的日期時間數據類型

[英]datetime dtypes in pandas read_csv

我正在讀取具有多個日期時間列的 csv 文件。 我需要在讀取文件時設置數據類型,但日期時間似乎是一個問題。 例如:

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

運行時報錯:

類型錯誤:無法理解數據類型“日期時間”

事后轉換列,通過 pandas.to_datetime() 不是一個選項,我不知道哪些列將是 datetime 對象。 該信息可以更改並且來自通知我的 dtypes 列表的任何內容。

或者,我嘗試使用 numpy.genfromtxt 加載 csv 文件,在該函數中設置 dtypes,然后轉換為 pandas.dataframe 但它會使數據出現亂碼。 任何幫助是極大的贊賞!

為什么它不起作用

沒有為 read_csv 設置 datetime dtype,因為 csv 文件只能包含字符串、整數和浮點數。

將 dtype 設置為 datetime 將使 Pandas 將日期時間解釋為一個對象,這意味着您最終會得到一個字符串。

熊貓解決這個問題的方法

pandas.read_csv()函數有一個名為parse_dates的關鍵字參數

使用它,您可以使用默認的date_parser ( dateutil.parser.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)

這將導致熊貓將col1col2讀取為字符串,它們很可能是(“2016-05-05”等),並且在讀取字符串后,每列的 date_parser 將對該字符串進行操作並返回任何內容函數返回。

定義自己的日期解析函數:

pandas.read_csv()函數還有一個名為date_parser的關鍵字參數

將此設置為 lambda 函數將使該特定函數用於解析日期。

陷阱警告

你必須給它函數,而不是函數的執行,因此這是正確的

date_parser = pd.datetools.to_datetime

這是不正確的

date_parser = pd.datetools.to_datetime()

熊貓 0.22 更新

pd.datetools.to_datetime已重新定位到date_parser = pd.to_datetime

謝謝@stackoverYC

有一個parse_dates的參數read_csv它允許您定義你想要的日期或日期時間處理的列的名稱:

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

您可以嘗試傳遞實際類型而不是字符串。

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)

但是,如果沒有您的任何數據可以修補,就很難診斷出這一點。

實際上,您可能希望熊貓將日期解析為時間戳,因此可能是:

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

我嘗試使用 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 替換 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)

我的解決方法是將其加載為默認類型,然后向下一行使用 pandas.to_datetime() 函數。

df[target_col] = pd.to_datetime(df[target_col])

我使用了以下代碼並且它有效:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM