2014-02-16 83 views
6

如果我有一個數據幀,並且第一列是datetime64列。如何將此列分成2個新列,日期列和時間列。這是我的數據和代碼至今:將datetime64列拆分爲pandas數據框中的日期和時間列

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 
... 


import pandas as pd 
nfp = pd.read_csv("NFP.csv", parse_dates=[0]) 
nfp 

給出:

Out[10]: <class 'pandas.core.frame.DataFrame'> 
     Int64Index: 83 entries, 0 to 82 
     Data columns (total 4 columns): 
     DateTime  82 non-null values 
     Actual  82 non-null values 
     Consensus 82 non-null values 
     Previous  82 non-null values 
     dtypes: datetime64[ns](1), float64(3) 

都好,但不知道該怎麼在這裏做。

兩點具體我不確定:

  1. 是否有可能做到這一點,當我讀到擺在首位的csv文件?如果是這樣,怎麼樣?
  2. 任何人可以幫助告訴我如何執行csv_read之後的拆分?

還有什麼地方可以查看這種信息嗎?

很難找到類庫的詳細參考謝謝!

回答

26

如何解析CSV直接進入所期望的數據幀:

傳遞的功能的字典來pandas.read_csvconverters關鍵字參數:

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 
  1. sep=r'[\s,]'告訴read_csv在 正則表達式模式r'[\s,]'上分割csv的行 - 一個空格或逗號。
  2. 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 

我在哪裏可以看一下這方面的信息?

  1. 有時你可以在Pandas Cookbook找到示例。
  2. 有時網絡搜索或搜索Stackoverflow就足夠了。
  3. 花什麼也沒有下雪週末做的,但讀 pandas documentation一定會幫助了。
  4. 安裝IPython。它具有製表符完成功能,如果您在 函數之後鍵入?,它將爲您提供該函數的文檔字符串。這兩個功能 確實可以幫助您快速反思Python對象。它還告訴你在函數定義哪些文件(如果在純Python定義) - 這使我...
  5. Reading the source code

只要堅持下去。你越瞭解它就越容易。

如果你給它您的最佳的射擊,但還是無法找到答案,張貼#2的問題。你會很快得到答案,並幫助其他人尋找相同的東西。

+0

非常感謝你的詳細解答。這正是我正在尋找的。特別感謝信息來源。來自C++/C#開發人員發現,學習所有這些新庫比我想象的要難! – azuric

+0

僅供參考嘗試to_datetime和read_csv與新的infer_datetime_format = True;應該更快 – Jeff

+0

@Jeff:感謝您的信息。我添加了'infer_datetime_format = True'。你會在哪裏使用'to_datetime'? – unutbu

相關問題