2017-03-09 104 views
1

我想學習Python,來自SAS背景。
我已經導入了SAS數據集,我注意到的一件事是我有多個日期列作爲SAS日期(我相信)。 在環顧四周,我發現這解釋瞭如何執行此(here)鏈接:在熊貓中轉換SAS日期時間 - 多列

的代碼如下:

alldata['DateFirstOnsite'] = pd.to_timedelta(alldata.DateFirstOnsite, unit='s') + pd.datetime(1960, 1, 1) 

不過,我不知道如何爲多列做到這一點。如果我有多個日期字段,而不是多次重複這行代碼,我可以創建一個我有的字段列表,然後在該字段列表上運行此代碼?這是如何完成的?

在此先感謝

回答

0

是的,它可以創建一個列表,通過該列表循環轉換的SAS日期字段大熊貓日期時間。但是,我不確定爲什麼要使用to_timedelta方法,除非在1960/01/01之後SAS日期字段以秒錶示。如果您計劃使用to_timedelta方法,那麼它簡單地創建一個函數,你df和你的領域,並通過這兩個給你的函數的情況:

def convert_SAS_to_datetime(df, field): 
    df[field] = pd.to_timedelta(df[field], unit='s') + pd.datetime(1960, 1, 1) 
    return df 

現在,讓我們假設你有你的字段列表你知道應該轉換爲datetime場(連同您的DF):

my_list = ['field1','field2','field3','field4','field5'] 
my_df = pd.read_sas('mySASfile.sas7bdat') # your SAS data that's converted to a pandas DF 

您現在可以通過列表迭代與for循環,同時使這些領域,你的DF的功能:

現在210
for field in my_list: 
    my_df = convert_SAS_to_datetime(my_df, field) 

,其他的方法我會建議使用to_datetime方法,但是這是假定你知道你的日期字段的格式SAS是。

例如01Jan2016 # date9 format

這是您可能需要查看文檔here以確定轉換日期的指令。在格式爲date9的情況下,您可以使用:

df[field] = pd.to_datetime(df[date9field], format="%d%b%Y") 
+0

這很好。謝謝您的幫助! – BPC

0

如果我正確地讀出你的問題,你想你的代碼適用於多個列?要做到這一點簡單的做到這一點:

alldata[['col1','col2','col3']] = 'your_code_here'

〔實施例:

import pandas as pd 
import numpy as np 
df = pd.DataFrame({'A' : [np.NaN,np.NaN,3,4,5,5,3,1,5,np.NaN], 
        'B' : [1,0,3,5,0,0,np.NaN,9,0,0], 
        'C' : ['Pharmacy of IDAHO','Access medicare arkansas','NJ Pharmacy','Idaho Rx','CA Herbals','Florida Pharma','AK RX','Ohio Drugs','PA Rx','USA Pharma'], 
        'D' : [123456,123456,1234567,12345678,12345,12345,12345678,123456789,1234567,np.NaN], 
        'E' : ['Assign','Unassign','Assign','Ugly','Appreciate','Undo','Assign','Unicycle','Assign','Unicorn',]}) 

df[['E', 'D']] = 1 # <---- notice double brackets 
print(df) 

    A B       C D E 
0 NaN 1.0   Pharmacy of IDAHO 1 1 
1 NaN 0.0 Access medicare arkansas 1 1 
2 3.0 3.0    NJ Pharmacy 1 1 
3 4.0 5.0     Idaho Rx 1 1 
4 5.0 0.0    CA Herbals 1 1 
5 5.0 0.0   Florida Pharma 1 1 
6 3.0 NaN      AK RX 1 1 
7 1.0 9.0    Ohio Drugs 1 1 
8 5.0 0.0      PA Rx 1 1 
9 NaN 0.0    USA Pharma 1 1 

通知在一開始的雙括號。希望這可以幫助!

+0

謝謝MattR。不是我想要的,但是下面的回答非常好。感謝您花時間幫忙。 – BPC