Python 使用Pandas追加数据时出现的问题
问题:-我想建立一个逻辑,获取考勤数据、时间、员工Id等数据,并返回一个数据框,其中包含员工Id、时间、考勤日期以及员工基本上在哪个时段输入的数据。(假设时间是2019年10月14日的9:30:00,因此,如果员工在该日期和该列的9:30到达,则插入一个值1。) 下面给出的示例 我花了很多时间来构建这个问题的逻辑,但都失败了 我有一个看起来像这样的数据集 我想要这样的输出,以便无论何时(雇员输入),它都只向该时间列插入数据: 这是我的代码,但它只是重复最后一个循环Python 使用Pandas追加数据时出现的问题,python,pandas,Python,Pandas,问题:-我想建立一个逻辑,获取考勤数据、时间、员工Id等数据,并返回一个数据框,其中包含员工Id、时间、考勤日期以及员工基本上在哪个时段输入的数据。(假设时间是2019年10月14日的9:30:00,因此,如果员工在该日期和该列的9:30到达,则插入一个值1。) 下面给出的示例 我花了很多时间来构建这个问题的逻辑,但都失败了 我有一个看起来像这样的数据集 我想要这样的输出,以便无论何时(雇员输入),它都只向该时间列插入数据: 这是我的代码,但它只是重复最后一个循环 temp =[] for
temp =[]
for date in nf['DaiGong']:
for en in nf['EnNo']:
for i in nf['DateTime']:
col=['EnNo','Date','InTime','9:30-10:30','10:30-11:00','11:00-11:30','11:30-12:30','12:30-13:00','13:00-13:30']
ndf=pd.DataFrame(columns=col)
if i < '10:30:00' and i > '09:30:00':
temp.append(1)
ndf['9:30-10:30'] = temp
ndf['InTime'] = i
ndf['Date'] = date
ndf['EnNo'] = en
elif i < '11:00:00' and i > '10:30:00':
temp.append(1)
ndf['10:30-11:00'] = temp
ndf['InTime'] = i
ndf['Date'] = date
ndf['EnNo'] = en
elif i < '11:30:00' and i > '11:00:00':
temp.append(1)
ndf['11:00-11:30'] = temp
ndf['InTime'] = i
ndf['Date'] = date
ndf['EnNo'] = en
elif i < '12:30:00' and i > '11:30:00':
temp.append(1)
ndf['11:30-12:30'] = temp
ndf['InTime'] = i
ndf['Date'] = date
ndf['EnNo'] = en
elif i < '13:00:00' and i > '12:30:00':
temp.append(1)
ndf['12:30-13:00'] = temp
ndf['InTime'] = i
ndf['Date'] = date
ndf['EnNo'] = en
elif i < '13:30:00' and i > '13:00:00':
temp.append(1)
ndf['13:00-13:30'] = temp
ndf['InTime'] = i
ndf['Date'] = date
ndf['EnNo'] = en
temp=[]
nf[‘代工’中的日期:
对于nf['EnNo']中的en:
对于nf['DateTime']中的i:
col=['EnNo','Date','InTime','9:30-10:30','10:30-11:00','11:00-11:30','11:30-12:30','12:30-13:00','13:00-13:30']
ndf=pd.DataFrame(columns=col)
如果我<'10:30:00'和我>'09:30:00':
临时附加(1)
ndf['9:30-10:30']=温度
ndf['InTime']=i
ndf['Date']=日期
ndf['EnNo']=en
如果我<'11:00:00'和我>'10:30:00':
临时附加(1)
ndf['10:30-11:00']=温度
ndf['InTime']=i
ndf['Date']=日期
ndf['EnNo']=en
如果我<'11:30:00'和我>'11:00:00':
临时附加(1)
ndf['11:00-11:30']=温度
ndf['InTime']=i
ndf['Date']=日期
ndf['EnNo']=en
如果我<'12:30:00'和我>'11:30:00':
临时附加(1)
ndf['11:30-12:30']=温度
ndf['InTime']=i
ndf['Date']=日期
ndf['EnNo']=en
如果我<'13:00:00'和我>'12:30:00':
临时附加(1)
ndf['12:30-13:00']=温度
ndf['InTime']=i
ndf['Date']=日期
ndf['EnNo']=en
如果我<'13:30:00'和我>'13:00:00':
临时附加(1)
ndf['13:00-13:30']=温度
ndf['InTime']=i
ndf['Date']=日期
ndf['EnNo']=en
这是我的代码的输出
IIUC
df = pd.DataFrame({'EnNo':[2,2,2,2,2,3,3,3,3],
'DaiGong':['2019-10-12', '2019-10-13', '2019-10-14', '2019-10-15', '2019-10-16', '2019-10-12', '2019-10-13', '2019-10-14', '2019-10-15'],
'DateTime':['09:53:56', '10:53:56', '09:23:56', '11:53:56', '11:23:56', '10:33:56', '12:53:56', '12:23:56', '09:53:56']})
df
DaiGong DateTime EnNo
0 2019-10-12 09:53:56 2
1 2019-10-13 10:53:56 2
2 2019-10-14 09:23:56 2
3 2019-10-15 11:53:56 2
4 2019-10-16 11:23:56 2
5 2019-10-12 10:33:56 3
6 2019-10-13 12:53:56 3
7 2019-10-14 12:23:56 3
8 2019-10-15 09:53:56 3
import datetime
df['DateTime'] = pd.to_datetime(df['DateTime']).dt.time #converting to datetime
def time_range(row): # I only wrote two conditions - add more
i = row['DateTime']
if i < datetime.time(10, 30, 0) and i > datetime.time(9, 30, 0):
return '9:30-10:30'
elif i < datetime.time(11, 0, 0) and i > datetime.time(10, 30, 0):
return '10:30-11:00'
else:
return 'greater than 11:00'
df['time range'] = df.apply(time_range, axis=1)
df1 = pd.concat([df[['EnNo', 'DaiGong', 'DateTime']], pd.get_dummies(df['time range'])], axis=1)
df1
EnNo DaiGong DateTime 10:30-11:00 9:30-10:30 greater than 11:00
0 2 2019-10-12 09:53:56 0 1 0
1 2 2019-10-13 10:53:56 1 0 0
2 2 2019-10-14 09:23:56 0 0 1
3 2 2019-10-15 11:53:56 0 0 1
4 2 2019-10-16 11:23:56 0 0 1
5 3 2019-10-12 10:33:56 1 0 0
6 3 2019-10-13 12:53:56 0 0 1
7 3 2019-10-14 12:23:56 0 0 1
8 3 2019-10-15 09:53:56 0 1 0
To get sum of count by employee,
df1.groupby(['EnNo'], as_index=False).sum()
df=pd.DataFrame({'EnNo':[2,2,2,2,3,3,3,3],
“代工”:[“2019-10-12”、“2019-10-13”、“2019-10-14”、“2019-10-15”、“2019-10-16”、“2019-10-12”、“2019-10-13”、“2019-10-14”、“2019-10-15”],
“日期时间”:[09:53:56”,“10:53:56”,“09:23:56”,“11:53:56”,“11:23:56”,“10:33:56”,“12:53:56”,“12:23:56”,“09:53:56])
df
代工日期时间EnNo
0 2019-10-12 09:53:56 2
1 2019-10-13 10:53:56 2
2 2019-10-14 09:23:56 2
3 2019-10-15 11:53:56 2
4 2019-10-16 11:23:56 2
5 2019-10-12 10:33:56 3
6 2019-10-13 12:53:56 3
7 2019-10-14 12:23:56 3
8 2019-10-15 09:53:56 3
导入日期时间
df['DateTime']=pd.to_DateTime(df['DateTime']).dt.time#转换为DateTime
定义时间范围(行):#我只写了两个条件-添加更多
i=行['DateTime']
如果idatetime.time(9,30,0):
返回“9:30-10:30”
如果idatetime.time(10,30,0):
返回“10:30-11:00”
其他:
返回“大于11:00”
df['time range']=df.apply(时间范围,轴=1)
df1=pd.concat([df['EnNo','DaiGong','DateTime']],pd.get_假人(df['time range']),axis=1)
df1
恩诺代工日期时间10:30-11:00 9:30-10:30大于11:00
0 2 2019-10-12 09:53:56 0 1 0
1 2 2019-10-13 10:53:56 1 0 0
2 2 2019-10-14 09:23:56 0 0 1
3 2 2019-10-15 11:53:56 0 0 1
4 2 2019-10-16 11:23:56 0 0 1
5 3 2019-10-12 10:33:56 1 0 0
6 3 2019-10-13 12:53:56 0 0 1
7 3 2019-10-14 12:23:56 0 0 1
8 3 2019-10-15 09:53:56 0 1 0
要按员工获取计数总和,
df1.groupby(['EnNo'],as_index=False).sum()
如果您对我的测试数据有任何疑问,请告诉我:
df:
EnNo DaiGong DateTime
2 2019-10-12 09:53:56
2 2019-10-13 09:42:00
2 2019-10-14 12:00:01
1 2019-11-01 11:12:00
1 2019-11-02 10:13:45
创建辅助数据:
tdr=pd.timedelta_range("09:00:00","12:30:00",freq="30T")
s=pd.Series( len(tdr)*["-"] )
s[0]=1
cls=[ t.rsplit(":",maxsplit=1)[0] for t in tdr.astype(str) ]
cols=[ t1+"-"+t2 for (t1,t2) in zip(cls,cls[1:]) ]
cols.append(cls[-1]+"-")
tdr:
TimedeltaIndex(['09:00:00', '09:30:00', '10:00:00', '10:30:00', '11:00:00', '11:30:00', '12:00:00', '12:30:00'], dtype='timedelta64[ns]', freq='30T')
cols:
['09:00-09:30', '09:30-10:00', '10:00-10:30', '10:30-11:00', '11:00-11:30', '11:30-12:00', '12:00-12:30', '12:30-']
s:
0 1
1 -
2 -
3 -
4 -
5 -
6 -
7 -
dtype: object
使用“应用”和“搜索排序”获取时间段:
df2= df.DateTime.apply(lambda t: \
s.shift(tdr.searchsorted(t)-1,fill_value="-"))
df2.columns=cols
df2:
09:00-09:30 09:30-10:00 10:00-10:30 10:30-11:00 11:00-11:30 11:30-12:00 12:00-12:30 12:30-
0 - 1 - - - - - -
1 - 1 - - - - - -
2 - - - - - - 1 -
3 - - - - 1 - - -
4 - - 1 - - - - -
最后,连接两个数据帧:
df_rslt= pd.concat([df,df2],axis=1)
df_rslt:
EnNo DaiGong DateTime 09:00-09:30 09:30-10:00 10:00-10:30 10:30-11:00 11:00-11:30 11:30-12:00 12:00-12:30 12:30-
0 2 2019-10-12 09:53:56 - 1 - - - - - -
1 2 2019-10-13 09:42:00 - 1 - - - - - -
2 2 2019-10-14 12:00:01 - - - - - - 1 -
3 1 2019-11-01 11:12:00 - - - - 1 - - -
4 1 2019-11-02 10:13:45 - - 1 - - - - -
我没有看过你的代码,但输出似乎是正确的,对吗?先生,我想在任何员工输入的任何时间,都应该添加到该时间段列中。。如果员工ID 4在9:30到10:30之间输入,则该计数应存储在列中(按日期)。请帮助,先生,我有总的员工id 2到14(例如E id-2,3,4,5,6,7,8,9,10,11,12,13,14)。我希望如果有任何员工在9:30-10:30左右的其他时段上班。。所以我只想在员工输入的每个特定日期计算。所以在这里插入时间间隔的总计数。。。先生,我是新来的,所以请帮助。@SauravMishra在endSir更新答案,我得到了这个。。。非常感谢先生给我你的好久。