我希望将 datetime
/pandas
日期存储系统转换为 SAS
用于连接的存储系统一个变量。
基本上想从这里开始:
ID date
101 20-01-01
102 21-01-01
103 22-01-01
对此:
ID DateID date
101 10114995 20-01-01
102 10214996 21-01-01
103 10314997 22-01-01
我编写了一个函数来传递给每一行:
def SASdate(datein):
return str(math.trunc(pd.to_timedelta(pd.to_datetime(datein) - pd.to_datetime('1960-1-1'), unit='D') / pd.Timedelta(days=1)))
但我相信它距离优化还很远:
- 在我的实际数据集上运行需要很长时间。
- 输出似乎没有按预期连接。
例如:
str(df['ID']) + df['date'].apply([SASdate])
Out:
SASdate
0 0 101\n1 102\n2 103\nName: ID, dtype:...
1 0 101\n1 102\n2 103\nName: ID, dtype:...
2 0 101\n1 102\n2 103\nName: ID, dtype:...
我确信有一个 lambda 方法或更好的方法来连接我所缺少的这些方法,但它对我来说并不明显。
任何有关如何实现这一目标的建议将不胜感激。
下面的一些代码用于生成示例数据帧:
df = pd.DataFrame({'ID': [101,102,103],
'date': ['20-01-01', '21-01-01', '22-01-01']
})
最佳答案
只需以矢量化方式在 apply
之外使用您的函数即可:
def SASdate(datein):
origin = pd.to_datetime('1960-1-1')
return pd.to_datetime(datein, format='%d-%m-%y').sub(origin).dt.days
df['DateID'] = df['ID'].astype(str) + SASdate(df['date']).astype(str)
输出:
>>> df
ID date DateID
0 101 20-01-01 10114995
1 102 21-01-01 10214996
2 103 22-01-01 10314997
关于python - 将函数输出与现有列连接作为新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77134637/