【问题标题】:convert a SAS datetime in Pandas - Multiple Columns在 Pandas 中转换 SAS 日期时间 - 多列
【发布时间】:2017-03-09 19:58:35
【问题描述】:

我正在尝试学习 Python,来自 SAS 背景。
我已经导入了一个 SAS 数据集,我注意到的一件事是我有多个日期列作为 SAS 日期(我相信)。 在环顾四周时,我发现了一个解释如何执行此操作的链接 (here):

代码如下:

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

但是,我想知道如何为多个列执行此操作。如果我有多个日期字段,而不是多次重复这行代码,我可以创建我拥有的字段列表,然后在该字段列表上运行此代码吗?这是怎么做到的?

提前致谢

【问题讨论】:

    标签: python datetime


    【解决方案1】:

    是的,可以创建一个列表并遍历该列表以将 SAS 日期字段转换为 pandas 日期时间。但是,我不确定您为什么要使用 to_timedelta 方法,除非 SAS 日期字段以 1960/01/01 之后的秒数表示。如果您打算使用 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
    

    现在,假设您有您知道应该转换为日期时间字段的字段列表(连同您的 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 传递给函数:

    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")
    

    【讨论】:

      【解决方案2】:

      如果我正确阅读了您的问题,您想将您的代码应用于多个列吗?这样做很简单:

      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
      

      注意开头的双括号。希望这会有所帮助!

      【讨论】:

      • 感谢 MattR。不是我想要的,但下面的回复效果很好。感谢您抽出宝贵时间提供帮助。
      猜你喜欢
      • 2016-07-29
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      相关资源
      最近更新 更多