如何解析CSV直接進入所期望的數據幀:
傳遞的功能的字典來pandas.read_csv
的converters
關鍵字參數:
import pandas as pd
import datetime as DT
nfp = pd.read_csv("NFP.csv",
sep=r'[\s,]', # 1
header=None, skiprows=1,
converters={ # 2
0: lambda x: DT.datetime.strptime(x, '%Y%m%d'),
1: lambda x: DT.time(*map(int, x.split(':')))},
names=['Date', 'Time', 'Actual', 'Consensus', 'Previous'])
print(nfp)
產量
Date Time Actual Consensus Previous
0 2014-01-10 13:30:00 74000 196000 241000
1 2013-12-06 13:30:00 241000 180000 200000
2 2013-11-08 13:30:00 200000 125000 163000
3 2013-10-22 12:30:00 163000 180000 193000
4 2013-09-06 12:30:00 193000 180000 104000
5 2013-08-02 12:30:00 104000 184000 188000
6 2013-07-05 12:30:00 188000 165000 176000
7 2013-06-07 12:30:00 176000 170000 165000
8 2013-05-03 12:30:00 165000 145000 138000
9 2013-04-05 12:30:00 138000 200000 268000
sep=r'[\s,]'
告訴read_csv
在 正則表達式模式r'[\s,]'
上分割csv的行 - 一個空格或逗號。
converters
參數告訴read_csv
將給定的 函數應用於某些列。鍵(例如0和1)指的是 列索引,這些值是要應用的函數。
如何執行csv_read
import pandas as pd
nfp = pd.read_csv("NFP.csv", parse_dates=[0], infer_datetime_format=True)
temp = pd.DatetimeIndex(nfp['DateTime'])
nfp['Date'] = temp.date
nfp['Time'] = temp.time
del nfp['DateTime']
print(nfp)
這是更快拆分後的數據幀?
這取決於CSV的大小。 (感謝Jeff指出這)
對於微小的CSV,解析CSV成所需的形式直接比使用與parse_dates=[0]
解析後DatetimeIndex更快:
def using_converter():
nfp = pd.read_csv("NFP.csv", sep=r'[\s,]', header=None, skiprows=1,
converters={
0: lambda x: DT.datetime.strptime(x, '%Y%m%d'),
1: lambda x: DT.time(*map(int, x.split(':')))},
names=['Date', 'Time', 'Actual', 'Consensus', 'Previous'])
return nfp
def using_index():
nfp = pd.read_csv("NFP.csv", parse_dates=[0], infer_datetime_format=True)
temp = pd.DatetimeIndex(nfp['DateTime'])
nfp['Date'] = temp.date
nfp['Time'] = temp.time
del nfp['DateTime']
return nfp
In [114]: %timeit using_index()
100 loops, best of 3: 1.71 ms per loop
In [115]: %timeit using_converter()
1000 loops, best of 3: 914 µs per loop
然而,對於剛剛的CSV幾百行或更多,使用DatetimeIndex更快。
N = 20
filename = '/tmp/data'
content = '''\
DateTime,Actual,Consensus,Previous
20140110 13:30:00,74000,196000,241000
20131206 13:30:00,241000,180000,200000
20131108 13:30:00,200000,125000,163000
20131022 12:30:00,163000,180000,193000
20130906 12:30:00,193000,180000,104000
20130802 12:30:00,104000,184000,188000
20130705 12:30:00,188000,165000,176000
20130607 12:30:00,176000,170000,165000
20130503 12:30:00,165000,145000,138000
20130405 12:30:00,138000,200000,268000'''
def setup(n):
header, remainder = content.split('\n', 1)
with open(filename, 'w') as f:
f.write('\n'.join([header]+[remainder]*n))
In [304]: setup(50)
In [305]: %timeit using_converter()
100 loops, best of 3: 9.78 ms per loop
In [306]: %timeit using_index()
100 loops, best of 3: 9.3 ms per loop
我在哪裏可以看一下這方面的信息?
- 有時你可以在Pandas Cookbook找到示例。
- 有時網絡搜索或搜索Stackoverflow就足夠了。
- 花什麼也沒有下雪週末做的,但讀 pandas documentation一定會幫助了。
- 安裝IPython。它具有製表符完成功能,如果您在 函數之後鍵入
?
,它將爲您提供該函數的文檔字符串。這兩個功能 確實可以幫助您快速反思Python對象。它還告訴你在函數定義哪些文件(如果在純Python定義) - 這使我...
- Reading the source code
只要堅持下去。你越瞭解它就越容易。
如果你給它您的最佳的射擊,但還是無法找到答案,張貼#2的問題。你會很快得到答案,並幫助其他人尋找相同的東西。
非常感謝你的詳細解答。這正是我正在尋找的。特別感謝信息來源。來自C++/C#開發人員發現,學習所有這些新庫比我想象的要難! – azuric
僅供參考嘗試to_datetime和read_csv與新的infer_datetime_format = True;應該更快 – Jeff
@Jeff:感謝您的信息。我添加了'infer_datetime_format = True'。你會在哪裏使用'to_datetime'? – unutbu