Pandas计算工作持续时间并在现有csv末尾添加新列



我对熊猫很陌生,我得到了一些员工的数据,这些数据有日期、月份和年份的开始和结束日期,基本上是一个有列表的列。以下是我的数据格式,如下从csv列中提取的。

data =[
{
"starts_at":{
"day":1,
"month":8,
"year":2021
},
"ends_at":None
},
{
"starts_at":{
"day":1,
"month":9,
"year":2020
},
"ends_at":{
"day":30,
"month":4,
"year":2021
}
},
{
"starts_at":None,
"ends_at":{
"day":30,
"month":4,
"year":2021
}
}
]

基本上,如果ends_atNone,则用户当前正在工作(正在进行(,并且如果指定了结束日期,则用户已经结束了与公司的合同。

有一些故障数据,比如start_date是None,end_date有日期,这些也是我考虑过的,但都是用python的方式。

我被告知要用熊猫的方式来做,但我认为我错过了熊猫的技术,而不是在n*2的时间复杂性中使用双循环。

以下是我如何用蟒蛇般的方式弄脏我的手

from datetime import datetime
from datetime import date
from dateutil import relativedelta as rdelta
today = date.today()
df =pd.read_csv('/home/navaraj/Downloads/profile-details.csv')
pd.set_option('display.max_colwidth', None)
df["experiences"] = df["experiences"].apply(eval)

print(df['experiences'])
for k in df["experiences"]:
for x in k:
starts=(x.get('starts_at'))
if starts is not None:
ends=(x.get('ends_at'))
end_date_day=end_date_month=end_date_year=None
status=None
if ends is None:
ends=today
status="On going"
else:
end_date_day=ends['day']
end_date_month=ends['month']
end_date_year=ends['year']
ends=datetime.strptime(f'{end_date_year}-{end_date_month}-{end_date_day}', '%Y-%m-%d').date()
status="ended"

starts_day=starts['day']
starts_month=starts['month']
starts_year=starts['year']
started=datetime.strptime(f'{starts_year}-{starts_month}-{starts_day}', '%Y-%m-%d').date()
rd = rdelta.relativedelta(ends,started)
result="{0.years} years and {0.months} months".format(rd)
print(result,status)

问题和期望:我只是想把最后一行数据,即result和正在工作的status(正在进行或已结束(附加在当前csv文件的末尾,对于我正在工作的每个用户来说,任何帮助都会非常棒。

假设"attached at the end"的意思是在每行的末尾,定义一个函数用于调用pd.apply是避免在df上显式循环的一种方法。

以下是"状态",但"结果"也可以这样做

功能

def determine_status(row: pd.Series) -> str:
if row['starts_at']:
if row['ends_at']:
return "ended"
return "On going"

通过此调用应用于df,设置一个等于结果的新列

df.loc[:,'status'] = df.apply(determine_status, axis=1)

输出

starts_at                                ends_at    status
0  {'day': 1, 'month': 8, 'year': 2021}                                   None  On going
1  {'day': 1, 'month': 9, 'year': 2020}  {'day': 30, 'month': 4, 'year': 2021}     ended
2                                  None  {'day': 30, 'month': 4, 'year': 2021}      None

最新更新