2017-03-09 74 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