Home > OS >  Calculating working hours for everyday for every worker using excel and python Dataframe
Calculating working hours for everyday for every worker using excel and python Dataframe

Time:08-12

i have an excel file that records every time a worker check's in and out of the office during the day using a column that takes two values "entrer" is check in/ "sortie" is check out, i need to calculate how much time the worker stayed in the office for every day in the month and if the worker forgot to check in just add a column to the table with the value "anomaly".

now i got it working for one day of the week 100% and the whole file also but as soon i have to separate by day and month to calculate the total hours it just spits out errors and i have to remove the grouping by ID but then the count is no good.

this is my code right now:

df = pd.read_excel("./fp.xls")
df = df.sort_values("Date And Time")
regEx = r'^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$'
    
for x,n in enumerate(df.values[1]):
    if bool(re.match(regEx,str(n))):
        df[df.columns[x]] = pd.to_datetime(df[df.columns[x]])
      
results = [part for _, part in df.groupby(pd.Grouper(key='Date And Time',freq='1D'))] 

#this is the grouping by id that i didn't know how to use wit the date
group = df.groupby("Personnel ID")

# dates =group.apply(lambda x: x['Date And Time'].unique())
zz=pd.Timedelta(0)
lam=[]
res=[]
for x in results:
    # print(x["Event Point"])
    if len(x)%2!=0:
        print("anomaly")
    else:
        lam.append(x)
        
for i in range(0,len(lam)):
    if(len(lam[i])==0):
        print("weekend")
    else:
        for y in lam[i].values:
            status = y[2]
            if status == "Entree":
                hh = y[0]
            else:
                kk=y[0]-hh
                zz=zz kk
        print(pd.to_datetime(lam[i].values[0][0]).date(),lam[i].values[0][1],zz)
        zz=pd.Timedelta(0)

this is the data for one day:

{'Date And Time': {0: '2020-10-15 18:59:18', 1: '2020-10-15 18:23:28', 2: '2020-10-15 18:21:01', 3: '2020-10-15 14:02:11', 4: 
'2020-10-15 14:02:08', 5: '2020-10-15 13:51:34', 6: '2020-10-15 12:22:51', 7: '2020-10-15 12:07:39', 8: '2020-10-15 12:05:21', 9: '2020-10-15 12:02:31', 10: '2020-10-15 10:24:37', 11: '2020-10-15 09:02:51', 12: '2020-10-15 08:54:57', 13: '2020-10-15 08:44:10', 14: '2020-10-15 08:15:31'}, 'Personnel ID': {0: 44, 1: 41, 2: 43, 3: 43, 4: 44, 5: 41, 6: 44, 7: 41, 8: 41, 9: 43, 10: 42, 11: 42, 12: 43, 13: 44, 14: 41}, 'Event Point': {0: 'Sortie', 1: 'Sortie', 2: 'Sortie', 3: 'Entree', 4: 'Entree', 5: 'Entree', 6: 'Sortie', 7: 'Sortie', 8: 'Sortie', 9: 'Sortie', 10: 
'Sortie', 11: 'Entree', 12: 'Entree', 13: 'Entree', 14: 'Entree'}}

and here for two months:

{'Date And Time': {0: '2020-09-23 18:11:05', 1: '2020-09-23 18:01:58', 2: '2020-09-23 18:01:52', 3: '2020-09-23 18:01:47', 4: '2020-09-23 14:12:16', 5: '2020-09-23 14:06:12', 6: '2020-09-23 13:46:43', 7: '2020-09-23 13:27:54', 8: '2020-09-23 12:07:59', 9: '2020-09-23 12:07:46', 10: '2020-09-23 12:04:50', 11: '2020-09-23 12:04:42', 12: '2020-09-23 08:46:20', 13: '2020-09-23 08:45:14', 14: '2020-09-23 08:40:54', 15: '2020-09-23 08:15:36', 16: '2020-09-22 18:15:29', 17: '2020-09-22 18:15:27', 18: '2020-09-22 18:14:45', 19: '2020-09-22 18:11:13', 20: '2020-09-22 14:17:49', 21: '2020-09-22 14:08:03', 22: '2020-09-22 14:05:55', 23: '2020-09-22 13:56:38', 24: '2020-09-22 12:33:23', 25: '2020-09-22 12:05:23', 26: '2020-09-22 12:04:13', 27: '2020-09-22 12:04:12', 28: '2020-09-22 08:51:03', 29: '2020-09-22 08:46:39', 30: '2020-09-22 08:35:43', 31: '2020-09-22 08:04:49', 32: '2020-09-21 18:12:05', 33: '2020-09-21 18:11:57', 34: '2020-09-21 18:11:49', 35: '2020-09-21 18:11:38', 36: '2020-09-21 14:07:34', 37: '2020-09-21 14:07:06', 38: '2020-09-21 14:04:33', 39: '2020-09-21 13:44:54', 40: '2020-09-21 12:20:47', 41: '2020-09-21 12:20:42', 42: '2020-09-21 12:18:42', 43: '2020-09-21 12:06:53', 44: '2020-09-21 08:53:35', 45: '2020-09-21 08:43:28', 46: '2020-09-21 08:43:26', 47: '2020-09-21 08:43:23', 48: '2020-09-21 08:02:12', 49: '2020-09-18 17:59:45', 50: '2020-09-18 17:59:39', 51: '2020-09-18 17:59:37', 52: '2020-09-18 17:55:39', 53: '2020-09-18 14:05:58', 54: '2020-09-18 14:02:50', 55: '2020-09-18 13:56:56', 56: '2020-09-18 13:21:58', 57: '2020-09-18 12:07:35', 58: '2020-09-18 12:06:20', 59: '2020-09-18 12:06:19', 60: '2020-09-18 12:03:41', 61: '2020-09-18 08:46:57', 62: '2020-09-18 08:43:50', 63: '2020-09-18 08:37:18', 64: '2020-09-18 08:17:51', 65: '2020-09-17 18:20:35', 66: '2020-09-17 18:03:24', 67: '2020-09-17 18:03:00', 68: '2020-09-17 15:30:39', 69: '2020-09-17 14:10:28', 70: '2020-09-17 14:06:52', 71: '2020-09-17 14:03:15', 72: '2020-09-17 12:15:34', 73: '2020-09-17 12:14:56', 74: '2020-09-17 12:14:50', 75: '2020-09-17 12:05:10', 76: '2020-09-17 08:56:54', 77: '2020-09-17 08:48:09', 78: '2020-09-17 08:36:53', 79: '2020-09-16 18:06:03', 80: '2020-09-16 18:05:38', 81: '2020-09-16 18:02:12', 82: '2020-09-16 17:22:34', 83: '2020-09-16 17:14:08', 84: '2020-09-16 14:07:49', 85: '2020-09-16 14:05:24', 86: '2020-09-16 14:00:05', 87: '2020-09-16 13:27:24', 88: '2020-09-16 12:16:30', 89: '2020-09-16 12:06:31', 90: '2020-09-16 12:06:21', 91: '2020-09-16 12:04:38', 92: '2020-09-16 08:46:13', 93: '2020-09-16 08:45:01', 94: '2020-09-16 08:41:41', 95: '2020-09-16 08:07:57', 96: '2020-09-15 18:05:33', 97: '2020-09-15 18:05:31', 98: '2020-09-15 18:03:37', 99: '2020-09-15 18:03:17', 100: '2020-09-15 14:20:40', 101: '2020-09-15 14:08:49', 102: '2020-09-15 13:59:10', 103: '2020-09-15 13:57:10', 104: '2020-09-15 12:46:12', 105: '2020-09-15 12:16:59', 106: '2020-09-15 12:16:46', 107: '2020-09-15 12:06:08', 108: '2020-09-15 12:05:30', 109: '2020-09-15 08:44:48', 110: '2020-09-15 08:42:40', 111: '2020-09-15 08:32:25', 112: '2020-09-15 08:05:41', 113: '2020-09-14 18:24:39', 114: '2020-09-14 18:24:28', 115: '2020-09-14 18:24:25', 116: '2020-09-14 18:21:59', 117: '2020-09-14 15:54:49', 118: '2020-09-14 14:24:58', 119: '2020-09-14 14:11:24', 120: '2020-09-14 14:07:22', 121: '2020-09-14 12:01:31', 122: '2020-09-14 12:01:28', 123: '2020-09-14 12:00:57', 124: '2020-09-14 11:25:14', 125: '2020-09-14 11:14:10', 126: '2020-09-14 08:45:52', 127: '2020-09-14 08:45:50', 128: '2020-09-14 08:40:20', 129: '2020-09-11 18:03:14', 130: '2020-09-11 18:00:52', 131: '2020-09-11 14:15:25', 132: '2020-09-11 14:09:48', 133: '2020-09-11 13:53:59', 134: '2020-09-11 12:04:33', 135: '2020-09-11 12:04:07', 136: '2020-09-11 08:45:38', 137: '2020-09-11 08:24:43', 138: '2020-09-10 18:15:37', 139: '2020-09-10 18:15:35', 140: '2020-09-10 18:10:08', 141: '2020-09-10 16:57:51', 142: '2020-09-10 16:45:37', 143: '2020-09-10 14:09:46', 144: '2020-09-10 13:57:23', 145: '2020-09-10 13:44:19', 146: '2020-09-10 12:14:35', 147: '2020-09-10 11:58:47', 148: '2020-09-10 09:50:05', 149: '2020-09-10 09:35:04', 150: '2020-09-10 08:48:23', 151: '2020-09-10 08:42:14', 152: '2020-09-10 08:15:31', 153: '2020-09-09 18:10:21', 154: '2020-09-09 18:10:13', 155: '2020-09-09 18:10:04', 156: '2020-09-09 18:01:47', 157: '2020-09-09 14:31:18', 158: '2020-09-09 14:01:18', 159: '2020-09-09 14:00:27', 160: '2020-09-09 13:39:51', 161: '2020-09-09 12:03:06', 162: '2020-09-09 12:03:04', 163: '2020-09-09 11:59:39', 164: '2020-09-09 11:57:19', 165: '2020-09-09 08:46:50', 166: '2020-09-09 08:44:19', 167: '2020-09-09 08:32:32', 168: '2020-09-09 08:07:07', 169: '2020-09-08 17:57:33', 170: '2020-09-08 17:57:18', 171: '2020-09-08 17:57:13', 172: '2020-09-08 17:54:38', 173: '2020-09-08 14:05:16', 174: '2020-09-08 14:04:59', 175: '2020-09-08 13:54:21', 176: '2020-09-08 13:41:54', 177: '2020-09-08 12:14:47', 178: '2020-09-08 12:14:44', 179: '2020-09-08 12:08:23', 180: '2020-09-08 12:01:40', 181: '2020-09-08 08:43:23', 182: '2020-09-08 08:43:10', 183: '2020-09-08 08:27:24', 184: '2020-09-08 08:04:59', 185: '2020-09-07 18:20:15', 186: '2020-09-07 18:19:01', 187: '2020-09-07 18:16:15', 188: '2020-09-07 17:58:54', 189: '2020-09-07 14:09:42', 190: '2020-09-07 14:07:07', 191: '2020-09-07 14:02:48', 192: '2020-09-07 14:02:31', 193: '2020-09-07 12:07:24', 194: '2020-09-07 12:07:22', 195: '2020-09-07 12:02:32', 196: '2020-09-07 11:58:33', 197: '2020-09-07 08:46:11', 198: '2020-09-07 08:41:10', 199: '2020-09-07 08:39:18', 200: '2020-09-07 08:01:50', 201: '2020-09-04 17:59:57', 202: '2020-09-04 17:55:19', 203: '2020-09-04 17:54:32', 204: '2020-09-04 17:54:25', 205: '2020-09-04 16:05:20', 206: '2020-09-04 14:11:30', 207: '2020-09-04 14:09:26', 208: '2020-09-04 14:04:35', 209: '2020-09-04 11:59:00', 210: '2020-09-04 11:58:56', 211: '2020-09-04 11:55:15', 212: '2020-09-04 08:52:33', 213: '2020-09-04 08:47:47', 214: '2020-09-04 08:40:39', 215: '2020-09-04 08:21:50', 216: '2020-09-04 08:05:18', 217: '2020-09-03 18:59:50', 218: '2020-09-03 18:59:48', 219: '2020-09-03 18:38:27', 220: '2020-09-03 17:57:14', 221: '2020-09-03 17:35:48', 222: '2020-09-03 17:20:15', 223: '2020-09-03 14:14:02', 224: '2020-09-03 13:59:30', 225: '2020-09-03 13:59:27', 226: '2020-09-03 13:24:34', 227: '2020-09-03 12:14:29', 228: '2020-09-03 12:14:10', 229: '2020-09-03 12:12:53', 230: '2020-09-03 12:02:28', 231: '2020-09-03 11:41:33', 232: '2020-09-03 09:43:46', 233: '2020-09-03 08:48:49', 234: '2020-09-03 08:42:45', 235: '2020-09-03 08:20:12', 236: '2020-09-03 08:08:36', 237: '2020-09-02 18:15:22', 238: '2020-09-02 18:15:20', 239: '2020-09-02 17:53:53', 240: '2020-09-02 14:10:58', 241: '2020-09-02 13:48:23', 242: '2020-09-02 13:29:09', 243: '2020-09-02 12:12:32', 244: '2020-09-02 12:10:34', 245: '2020-09-02 12:03:34', 246: '2020-09-02 08:46:33', 247: '2020-09-02 08:36:43', 248: '2020-09-02 08:12:36', 249: '2020-09-01 18:32:59', 250: '2020-09-01 18:19:36', 251: '2020-09-01 14:01:17', 252: '2020-09-01 13:49:08', 253: '2020-09-01 12:31:19', 254: '2020-09-01 12:03:16', 255: '2020-09-01 08:35:43', 256: '2020-09-01 08:30:01', 257: '2020-08-31 18:30:32', 258: '2020-08-31 18:21:44', 259: '2020-08-31 18:20:16', 260: '2020-08-31 17:32:19', 261: '2020-08-31 14:08:09', 262: '2020-08-31 13:59:47', 263: '2020-08-31 12:22:35', 264: '2020-08-31 12:02:21', 265: '2020-08-31 08:43:36', 266: '2020-08-31 08:27:49', 267: '2020-08-28 18:25:17', 268: '2020-08-28 18:15:43', 269: '2020-08-28 18:08:52', 270: '2020-08-28 17:15:30', 271: '2020-08-28 14:14:15', 272: '2020-08-28 14:12:24', 273: '2020-08-28 14:12:04', 274: '2020-08-28 13:54:11', 275: '2020-08-28 12:13:58', 276: '2020-08-28 12:13:56', 277: '2020-08-28 12:04:25', 278: '2020-08-28 11:57:17', 279: '2020-08-28 08:40:08', 280: '2020-08-28 08:39:15', 281: '2020-08-28 08:26:37', 282: '2020-08-28 08:18:56', 283: '2020-08-27 18:28:29', 284: '2020-08-27 18:28:25', 285: '2020-08-27 18:28:00', 286: '2020-08-27 18:16:39', 287: '2020-08-27 17:06:13', 288: '2020-08-27 16:51:08', 289: '2020-08-27 14:12:45', 290: '2020-08-27 14:07:19', 291: '2020-08-27 13:58:51', 292: '2020-08-27 13:28:47', 293: '2020-08-27 12:13:24', 294: '2020-08-27 12:13:21', 295: '2020-08-27 12:10:04', 296: '2020-08-27 12:01:29', 297: '2020-08-27 11:25:12', 298: '2020-08-27 08:44:47', 299: '2020-08-27 08:37:17', 300: '2020-08-27 08:21:51', 301: '2020-08-26 18:23:42', 302: '2020-08-26 18:02:09', 303: '2020-08-26 18:02:04', 304: '2020-08-26 17:46:49', 305: '2020-08-26 16:21:28', 306: '2020-08-26 15:23:51', 307: '2020-08-26 14:11:54', 308: '2020-08-26 14:08:07', 309: '2020-08-26 13:49:31', 310: '2020-08-26 13:43:04', 311: '2020-08-26 12:05:58', 312: '2020-08-26 12:04:42', 313: '2020-08-26 12:02:19', 314: '2020-08-26 11:59:11', 315: '2020-08-26 10:56:36', 316: '2020-08-26 10:32:39', 317: '2020-08-26 08:44:29', 318: '2020-08-26 08:39:17', 319: '2020-08-26 08:20:23', 320: '2020-08-26 08:00:39', 321: '2020-08-25 18:02:48', 322: '2020-08-25 17:38:40', 323: '2020-08-25 17:38:35', 324: '2020-08-25 16:39:59', 325: '2020-08-25 16:29:54', 326: '2020-08-25 14:13:16', 327: '2020-08-25 14:05:58', 328: '2020-08-25 13:51:39', 329: '2020-08-25 12:17:55', 330: '2020-08-25 12:17:52', 331: '2020-08-25 12:00:30', 332: '2020-08-25 08:40:26', 333: '2020-08-25 08:36:28', 334: '2020-08-25 08:28:43', 335: '2020-08-24 18:09:50', 336: '2020-08-24 18:08:48', 337: '2020-08-24 14:12:10', 338: '2020-08-24 13:46:25', 339: '2020-08-24 12:03:57', 340: '2020-08-24 12:03:38', 341: '2020-08-24 08:41:10', 342: '2020-08-24 08:07:33', 343: '2020-08-19 17:45:54', 344: '2020-08-19 14:01:46', 345: '2020-08-19 11:58:31', 346: '2020-08-19 09:37:37', 347: '2020-08-18 19:26:12', 348: '2020-08-18 15:08:31', 349: '2020-08-18 12:57:16', 350: '2020-08-18 09:46:00', 351: '2020-08-17 19:04:35', 352: '2020-08-17 14:03:39', 353: '2020-08-17 12:00:07', 354: '2020-08-17 08:45:19', 355: '2020-08-13 18:33:15', 356: '2020-08-13 18:22:00', 357: '2020-08-13 18:19:52', 358: '2020-08-13 14:21:03', 359: '2020-08-13 13:52:57', 360: '2020-08-13 13:18:46', 361: '2020-08-13 13:15:07', 362: '2020-08-13 12:25:10', 363: '2020-08-13 08:35:16', 364: '2020-08-13 08:34:25', 365: '2020-08-13 07:51:18', 366: '2020-08-12 19:04:16', 367: '2020-08-12 18:21:48', 368: '2020-08-12 18:21:45', 369: '2020-08-12 18:11:21', 370: '2020-08-12 16:03:08', 371: '2020-08-12 15:37:15', 372: '2020-08-12 15:16:53', 373: '2020-08-12 15:01:02', 374: '2020-08-12 14:05:57', 375: '2020-08-12 14:05:56', 376: '2020-08-12 13:50:11', 377: '2020-08-12 13:43:08', 378: '2020-08-12 12:16:47', 379: '2020-08-12 12:16:46', 380: '2020-08-12 11:59:56', 381: '2020-08-12 11:55:00', 382: '2020-08-12 11:34:49', 383: '2020-08-12 11:34:47', 384: '2020-08-12 11:30:15', 385: '2020-08-12 08:39:24', 386: '2020-08-12 08:28:24', 387: '2020-08-12 08:15:23', 388: '2020-08-11 18:02:46', 389: '2020-08-11 18:02:27', 390: '2020-08-11 18:00:38', 391: '2020-08-11 17:58:35', 392: '2020-08-11 14:03:41', 393: '2020-08-11 14:01:29', 394: '2020-08-11 13:56:08', 395: '2020-08-11 13:30:10', 396: '2020-08-11 12:38:57', 397: '2020-08-11 12:19:28', 398: '2020-08-11 12:19:15', 399: '2020-08-11 11:59:24', 400: '2020-08-11 11:51:12', 401: '2020-08-11 08:31:01', 402: '2020-08-11 08:31:00', 403: '2020-08-11 08:27:52', 404: '2020-08-10 23:24:25', 405: '2020-08-10 22:21:44', 406: '2020-08-10 22:17:45', 407: '2020-08-10 21:11:37', 408: '2020-08-10 20:00:09', 409: '2020-08-10 18:18:54', 410: '2020-08-10 18:16:40', 411: '2020-08-10 18:02:07', 412: '2020-08-10 14:59:06', 413: '2020-08-10 14:07:31', 414: '2020-08-10 14:05:17', 415: '2020-08-10 14:02:26', 416: '2020-08-10 12:14:18', 417: '2020-08-10 12:14:01', 418: '2020-08-10 12:02:52', 419: '2020-08-10 11:59:06', 420: '2020-08-10 11:55:53', 421: '2020-08-10 11:10:55', 422: '2020-08-10 10:41:08', 423: '2020-08-10 08:35:53', 424: '2020-08-10 08:34:11', 425: '2020-08-10 08:03:27', 426: '2020-08-07 18:38:30', 427: '2020-08-07 18:07:28', 428: '2020-08-07 18:07:22', 429: '2020-08-07 18:07:19', 430: '2020-08-07 17:59:29', 431: '2020-08-07 14:06:25', 432: '2020-08-07 14:06:18', 433: '2020-08-07 13:58:06', 434: '2020-08-07 12:23:07', 435: '2020-08-07 12:22:56', 436: '2020-08-07 12:00:48', 437: '2020-08-07 08:37:22', 438: '2020-08-07 08:31:57', 439: '2020-08-07 08:08:26', 440: '2020-08-06 18:47:41', 441: '2020-08-06 18:25:58', 442: '2020-08-06 18:07:21', 443: '2020-08-06 18:06:25', 444: '2020-08-06 16:15:31', 445: '2020-08-06 14:07:27', 446: '2020-08-06 13:59:40', 447: '2020-08-06 13:53:46', 448: '2020-08-06 13:47:37', 449: '2020-08-06 13:14:54', 450: '2020-08-06 12:10:44', 451: '2020-08-06 12:03:07', 452: '2020-08-06 12:02:44', 453: '2020-08-06 11:58:53', 454: '2020-08-06 08:28:57', 455: '2020-08-06 08:25:59', 456: '2020-08-06 08:12:37', 457: '2020-08-06 08:11:22', 458: '2020-08-05 18:38:54', 459: '2020-08-05 18:20:40', 460: '2020-08-05 18:20:38', 461: '2020-08-05 18:20:32', 462: '2020-08-05 14:02:37', 463: '2020-08-05 13:54:04', 464: '2020-08-05 13:36:11', 465: '2020-08-05 13:07:56', 466: '2020-08-05 12:33:28', 467: '2020-08-05 12:27:42', 468: '2020-08-05 12:27:34', 469: '2020-08-05 12:21:09', 470: '2020-08-05 10:58:44', 471: '2020-08-05 08:35:38', 472: '2020-08-05 08:27:57', 473: '2020-08-05 08:14:06', 474: '2020-08-04 18:22:47', 475: '2020-08-04 18:22:45', 476: '2020-08-04 18:22:43', 477: '2020-08-04 16:55:41', 478: '2020-08-04 16:44:36', 479: '2020-08-04 16:26:28', 480: '2020-08-04 16:24:56', 481: '2020-08-04 14:07:33', 482: '2020-08-04 14:05:45', 483: '2020-08-04 14:02:30', 484: '2020-08-04 12:14:52', 485: '2020-08-04 12:14:50', 486: '2020-08-04 12:09:57', 487: '2020-08-04 08:35:58', 488: '2020-08-04 08:33:16', 489: '2020-08-04 08:15:55'}, 'Personnel ID': {0: 41, 1: 43, 2: 44, 3: 42, 4: 44, 5: 43, 6: 42, 7: 41, 8: 44, 9: 42, 10: 43, 11: 41, 12: 44, 13: 43, 14: 42, 15: 41, 16: 44, 17: 42, 18: 41, 19: 43, 20: 42, 21: 44, 22: 43, 23: 41, 24: 42, 25: 41, 26: 43, 27: 44, 28: 44, 29: 43, 30: 42, 31: 41, 32: 44, 33: 41, 34: 42, 35: 43, 36: 44, 37: 42, 38: 43, 39: 41, 40: 44, 41: 42, 42: 41, 43: 43, 44: 43, 45: 44, 46: 44, 47: 42, 48: 41, 49: 43, 50: 44, 51: 42, 52: 41, 53: 44, 54: 43, 55: 42, 56: 41, 57: 41, 58: 44, 59: 42, 60: 43, 61: 43, 62: 44, 63: 42, 64: 41, 65: 42, 66: 43, 67: 41, 68: 41, 69: 44, 70: 42, 71: 43, 72: 44, 73: 44, 74: 42, 75: 43, 76: 44, 77: 43, 78: 42, 79: 44, 80: 42, 81: 43, 82: 44, 83: 44, 84: 44, 85: 43, 86: 42, 87: 41, 88: 41, 89: 44, 90: 42, 91: 43, 92: 43, 93: 44, 94: 42, 95: 41, 96: 44, 97: 42, 98: 41, 99: 43, 100: 42, 101: 44, 102: 43, 103: 41, 104: 42, 105: 44, 106: 44, 107: 41, 108: 43, 109: 44, 110: 43, 111: 42, 112: 41, 113: 44, 114: 42, 115: 43, 116: 41, 117: 41, 118: 42, 119: 44, 120: 43, 121: 42, 122: 44, 123: 43, 124: 42, 125: 42, 126: 43, 127: 42, 128: 44, 129: 42, 130: 41, 131: 41, 132: 44, 133: 42, 134: 44, 135: 42, 136: 44, 137: 42, 138: 44, 139: 42, 140: 41, 141: 44, 142: 44, 143: 44, 144: 42, 145: 41, 146: 42, 147: 41, 148: 41, 149: 41, 150: 44, 151: 42, 152: 41, 153: 42, 154: 41, 155: 44, 156: 43, 157: 44, 158: 41, 159: 43, 160: 42, 161: 44, 162: 42, 163: 43, 164: 41, 165: 44, 166: 43, 167: 42, 168: 41, 169: 44, 170: 42, 171: 43, 172: 41, 173: 44, 174: 43, 175: 42, 176: 41, 177: 44, 178: 42, 179: 41, 180: 43, 181: 44, 182: 43, 183: 42, 184: 41, 185: 44, 186: 42, 187: 41, 188: 43, 189: 44, 190: 43, 191: 42, 192: 41, 193: 42, 194: 44, 195: 43, 196: 41, 197: 44, 198: 42, 199: 43, 200: 41, 201: 41, 202: 44, 203: 42, 204: 43, 205: 41, 206: 43, 207: 44, 208: 42, 209: 44, 210: 43, 211: 42, 212: 41, 213: 44, 214: 43, 215: 42, 216: 41, 217: 43, 218: 42, 219: 44, 220: 41, 221: 44, 222: 44, 223: 44, 224: 42, 225: 43, 226: 41, 227: 44, 228: 42, 229: 41, 230: 43, 231: 41, 232: 41, 233: 44, 234: 43, 235: 42, 236: 41, 237: 43, 238: 42, 239: 41, 240: 43, 241: 42, 242: 41, 243: 41, 244: 42, 245: 43, 246: 43, 247: 42, 248: 41, 249: 42, 250: 43, 251: 43, 252: 42, 253: 42, 254: 43, 255: 43, 256: 42, 257: 41, 258: 43, 259: 42, 260: 41, 261: 43, 262: 42, 263: 42, 264: 43, 265: 43, 266: 42, 267: 41, 268: 42, 269: 43, 270: 44, 271: 41, 272: 44, 273: 43, 274: 42, 275: 42, 276: 44, 277: 41, 278: 43, 279: 43, 280: 44, 281: 42, 282: 41, 283: 41, 284: 44, 285: 42, 286: 43, 287: 44, 288: 44, 289: 44, 290: 41, 291: 42, 292: 43, 293: 44, 294: 42, 295: 41, 296: 43, 297: 41, 298: 43, 299: 44, 300: 42, 301: 41, 302: 44, 303: 43, 304: 42, 305: 41, 306: 41, 307: 44, 308: 43, 309: 42, 310: 41, 311: 44, 312: 42, 313: 43, 314: 41, 315: 41, 316: 41, 317: 43, 318: 44, 319: 42, 320: 41, 321: 43, 322: 44, 323: 42, 324: 44, 325: 44, 326: 44, 327: 43, 328: 42, 329: 42, 330: 44, 331: 43, 332: 42, 333: 43, 334: 44, 335: 42, 336: 43, 337: 43, 338: 42, 339: 42, 340: 43, 341: 43, 342: 42, 343: 43, 344: 43, 345: 43, 346: 43, 347: 43, 348: 43, 349: 43, 350: 43, 351: 43, 352: 43, 353: 43, 354: 43, 355: 41, 356: 42, 357: 43, 358: 43, 359: 41, 360: 41, 361: 41, 362: 44, 363: 43, 364: 44, 365: 42, 366: 41, 367: 44, 368: 42, 369: 43, 370: 44, 371: 44, 372: 41, 373: 41, 374: 44, 375: 43, 376: 41, 377: 42, 378: 44, 379: 42, 380: 43, 381: 44, 382: 44, 383: 44, 384: 44, 385: 44, 386: 43, 387: 42, 388: 44, 389: 42, 390: 43, 391: 41, 392: 44, 393: 43, 394: 42, 395: 41, 396: 41, 397: 44, 398: 42, 399: 43, 400: 41, 401: 44, 402: 43, 403: 42, 404: 41, 405: 41, 406: 41, 407: 41, 408: 41, 409: 44, 410: 42, 411: 43, 412: 41, 413: 42, 414: 44, 415: 43, 416: 44, 417: 42, 418: 42, 419: 43, 420: 42, 421: 41, 422: 41, 423: 44, 424: 43, 425: 42, 426: 41, 427: 43, 428: 42, 429: 44, 430: 41, 431: 43, 432: 44, 433: 42, 434: 44, 435: 42, 436: 43, 437: 44, 438: 43, 439: 42, 440: 43, 441: 41, 442: 44, 443: 42, 444: 41, 445: 44, 446: 43, 447: 41, 448: 42, 449: 41, 450: 41, 451: 44, 452: 42, 453: 43, 454: 43, 455: 44, 456: 41, 457: 42, 458: 41, 459: 44, 460: 43, 461: 42, 462: 44, 463: 42, 464: 41, 465: 43, 466: 43, 467: 44, 468: 42, 469: 41, 470: 41, 471: 44, 472: 43, 473: 42, 474: 43, 475: 42, 476: 44, 477: 44, 478: 44, 479: 43, 480: 43, 481: 44, 482: 43, 483: 42, 484: 42, 485: 44, 486: 43, 487: 44, 488: 43, 489: 42}, 'Event Point': {0: 'Sortie', 1: 'Sortie', 2: 'Sortie', 3: 'Sortie', 4: 'Entree', 5: 'Entree', 6: 'Entree', 7: 'Entree', 8: 'Sortie', 9: 'Sortie', 10: 'Sortie', 11: 'Sortie', 12: 'Entree', 13: 'Entree', 14: 'Entree', 15: 'Entree', 16: 'Sortie', 17: 'Sortie', 18: 'Sortie', 19: 'Sortie', 20: 'Entree', 21: 'Entree', 22: 'Entree', 23: 'Entree', 24: 'Sortie', 25: 'Sortie', 26: 'Sortie', 27: 'Sortie', 28: 'Entree', 29: 'Entree', 30: 'Entree', 31: 'Entree', 32: 'Sortie', 33: 'Sortie', 34: 'Sortie', 35: 'Sortie', 36: 'Entree', 37: 'Entree', 38: 'Entree', 39: 'Entree', 40: 'Sortie', 41: 'Sortie', 42: 'Sortie', 43: 'Sortie', 44: 'Entree', 45: 'Entree', 46: 'Entree', 47: 'Entree', 48: 'Entree', 49: 'Sortie', 50: 'Sortie', 51: 'Sortie', 52: 'Sortie', 53: 'Entree', 54: 'Entree', 55: 'Entree', 56: 'Entree', 57: 'Sortie', 58: 'Sortie', 59: 'Sortie', 60: 'Sortie', 61: 'Entree', 62: 'Entree', 63: 'Entree', 64: 'Entree', 65: 'Sortie', 66: 'Sortie', 67: 'Sortie', 68: 'Entree', 69: 'Entree', 70: 'Entree', 71: 'Entree', 72: 'Sortie', 73: 'Sortie', 74: 'Sortie', 75: 'Sortie', 76: 'Entree', 77: 'Entree', 78: 'Entree', 79: 'Sortie', 80: 'Sortie', 81: 'Sortie', 82: 'Entree', 83: 'Sortie', 84: 'Entree', 85: 'Entree', 86: 'Entree', 87: 'Entree', 88: 'Sortie', 89: 'Sortie', 90: 'Sortie', 91: 'Sortie', 92: 'Entree', 93: 'Entree', 94: 'Entree', 95: 'Entree', 96: 'Sortie', 97: 'Sortie', 98: 'Sortie', 99: 'Sortie', 100: 'Entree', 101: 'Entree', 102: 'Entree', 103: 'Entree', 104: 'Sortie', 105: 'Sortie', 106: 'Sortie', 107: 'Sortie', 108: 'Sortie', 109: 'Entree', 110: 'Entree', 111: 'Entree', 112: 'Entree', 113: 'Sortie', 114: 'Sortie', 115: 'Sortie', 116: 'Sortie', 117: 'Entree', 118: 'Entree', 119: 'Entree', 120: 'Entree', 121: 'Sortie', 122: 'Sortie', 123: 'Sortie', 124: 'Entree', 125: 'Sortie', 126: 'Entree', 127: 'Entree', 128: 'Entree', 129: 'Sortie', 130: 'Sortie', 131: 'Entree', 132: 'Entree', 133: 'Entree', 134: 'Sortie', 135: 'Sortie', 136: 'Entree', 137: 'Entree', 138: 'Sortie', 139: 'Sortie', 140: 'Sortie', 141: 'Entree', 142: 'Sortie', 143: 'Entree', 144: 'Entree', 145: 'Entree', 146: 'Sortie', 147: 'Sortie', 148: 'Entree', 149: 'Sortie', 150: 'Entree', 151: 'Entree', 152: 'Entree', 153: 'Sortie', 154: 'Sortie', 155: 'Sortie', 156: 'Sortie', 157: 'Entree', 158: 'Entree', 159: 'Entree', 160: 'Entree', 161: 'Sortie', 162: 'Sortie', 163: 'Sortie', 164: 'Sortie', 165: 'Entree', 166: 'Entree', 167: 'Entree', 168: 'Entree', 169: 'Sortie', 170: 'Sortie', 171: 'Sortie', 172: 'Sortie', 173: 'Entree', 174: 'Entree', 175: 'Entree', 176: 'Entree', 177: 'Sortie', 178: 'Sortie', 179: 'Sortie', 180: 'Sortie', 181: 'Entree', 182: 'Entree', 183: 'Entree', 184: 'Entree', 185: 'Sortie', 186: 'Sortie', 187: 'Sortie', 188: 'Sortie', 189: 'Entree', 190: 'Entree', 191: 'Entree', 192: 'Entree', 193: 'Sortie', 194: 'Sortie', 195: 'Sortie', 196: 'Sortie', 197: 'Entree', 198: 'Entree', 199: 'Entree', 200: 'Entree', 201: 'Sortie', 202: 'Sortie', 203: 'Sortie', 204: 'Sortie', 205: 'Entree', 206: 'Entree', 207: 'Entree', 208: 'Entree', 209: 'Sortie', 210: 'Sortie', 211: 'Sortie', 212: 'Sortie', 213: 'Entree', 214: 'Entree', 215: 'Entree', 216: 'Entree', 217: 'Sortie', 218: 'Sortie', 219: 'Sortie', 220: 'Sortie', 221: 'Entree', 222: 'Sortie', 223: 'Entree', 224: 'Entree', 225: 'Entree', 226: 'Entree', 227: 'Sortie', 228: 'Sortie', 229: 'Sortie', 230: 'Sortie', 231: 'Entree', 232: 'Sortie', 233: 'Entree', 234: 'Entree', 235: 'Entree', 236: 'Entree', 237: 'Sortie', 238: 'Sortie', 239: 'Sortie', 240: 'Entree', 241: 'Entree', 242: 'Entree', 243: 'Sortie', 244: 'Sortie', 245: 'Sortie', 246: 'Entree', 247: 'Entree', 248: 'Entree', 249: 'Sortie', 250: 'Sortie', 251: 'Entree', 252: 'Entree', 253: 'Sortie', 254: 'Sortie', 255: 'Entree', 256: 'Entree', 257: 'Sortie', 258: 'Sortie', 259: 'Sortie', 260: 'Entree', 261: 'Entree', 262: 'Entree', 263: 'Sortie', 264: 'Sortie', 265: 'Entree', 266: 'Entree', 267: 'Sortie', 268: 'Sortie', 269: 'Sortie', 270: 'Sortie', 271: 'Entree', 272: 'Entree', 273: 'Entree', 274: 'Entree', 275: 'Sortie', 276: 'Sortie', 277: 'Sortie', 278: 'Sortie', 279: 'Entree', 280: 'Entree', 281: 'Entree', 282: 'Entree', 283: 'Sortie', 284: 'Sortie', 285: 'Sortie', 286: 'Sortie', 287: 'Entree', 288: 'Sortie', 289: 'Entree', 290: 'Entree', 291: 'Entree', 292: 'Entree', 293: 'Sortie', 294: 'Sortie', 295: 'Sortie', 296: 'Sortie', 297: 'Entree', 298: 'Entree', 299: 'Entree', 300: 'Entree', 301: 'Sortie', 302: 'Sortie', 303: 'Sortie', 304: 'Sortie', 305: 'Entree', 306: 'Sortie', 307: 'Entree', 308: 'Entree', 309: 'Entree', 310: 'Entree', 311: 'Sortie', 312: 'Sortie', 313: 'Sortie', 314: 'Sortie', 315: 'Entree', 316: 'Sortie', 317: 'Entree', 318: 'Entree', 319: 'Entree', 320: 'Entree', 321: 'Sortie', 322: 'Sortie', 323: 'Sortie', 324: 'Entree', 325: 'Sortie', 326: 'Entree', 327: 'Entree', 328: 'Entree', 329: 'Sortie', 330: 'Sortie', 331: 'Sortie', 332: 'Entree', 333: 'Entree', 334: 'Entree', 335: 'Sortie', 336: 'Sortie', 337: 'Entree', 338: 'Entree', 339: 'Sortie', 340: 'Sortie', 341: 'Entree', 342: 'Entree', 343: 'Sortie', 344: 'Entree', 345: 'Sortie', 346: 'Entree', 347: 'Sortie', 348: 'Entree', 349: 'Sortie', 350: 'Entree', 351: 'Sortie', 352: 'Entree', 353: 'Sortie', 354: 'Entree', 355: 'Sortie', 356: 'Sortie', 357: 'Sortie', 358: 'Entree', 359: 'Entree', 360: 'Sortie', 361: 'Entree', 362: 'Sortie', 363: 'Entree', 364: 'Entree', 365: 'Entree', 366: 'Sortie', 367: 'Sortie', 368: 'Sortie', 369: 'Sortie', 370: 'Entree', 371: 'Sortie', 372: 'Entree', 373: 'Sortie', 374: 'Entree', 375: 'Entree', 376: 'Entree', 377: 'Entree', 378: 'Sortie', 379: 'Sortie', 380: 'Sortie', 381: 'Entree', 382: 'Entree', 383: 'Sortie', 384: 'Sortie', 385: 'Entree', 386: 'Entree', 387: 'Entree', 388: 'Sortie', 389: 'Sortie', 390: 'Sortie', 391: 'Sortie', 392: 'Entree', 393: 'Entree', 394: 'Entree', 395: 'Entree', 396: 'Sortie', 397: 'Sortie', 398: 'Sortie', 399: 'Sortie', 400: 'Entree', 401: 'Entree', 402: 'Entree', 403: 'Entree', 404: 'Sortie', 405: 'Entree', 406: 'Sortie', 407: 'Entree', 408: 'Sortie', 409: 'Sortie', 410: 'Sortie', 411: 'Sortie', 412: 'Entree', 413: 'Entree', 414: 'Entree', 415: 'Entree', 416: 'Sortie', 417: 'Sortie', 418: 'Entree', 419: 'Sortie', 420: 'Sortie', 421: 'Sortie', 422: 'Entree', 423: 'Entree', 424: 'Entree', 425: 'Entree', 426: 'Sortie', 427: 'Sortie', 428: 'Sortie', 429: 'Sortie', 430: 'Entree', 431: 'Entree', 432: 'Entree', 433: 'Entree', 434: 'Sortie', 435: 'Sortie', 436: 'Sortie', 437: 'Entree', 438: 'Entree', 439: 'Entree', 440: 'Sortie', 441: 'Sortie', 442: 'Sortie', 443: 'Sortie', 444: 'Entree', 445: 'Entree', 446: 'Entree', 447: 'Sortie', 448: 'Entree', 449: 'Entree', 450: 'Sortie', 451: 'Sortie', 452: 'Sortie', 453: 'Sortie', 454: 'Entree', 455: 'Entree', 456: 'Entree', 457: 'Entree', 458: 'Sortie', 459: 'Sortie', 460: 'Sortie', 461: 'Sortie', 462: 'Entree', 463: 'Entree', 464: 'Entree', 465: 'Entree', 466: 'Sortie', 467: 'Sortie', 468: 'Sortie', 469: 'Sortie', 470: 'Entree', 471: 'Entree', 472: 'Entree', 473: 'Entree', 474: 'Sortie', 475: 'Sortie', 476: 'Sortie', 477: 'Entree', 478: 'Sortie', 479: 'Entree', 480: 'Sortie', 481: 'Entree', 482: 'Entree', 483: 'Entree', 484: 'Sortie', 485: 'Sortie', 486: 'Sortie', 487: 'Entree', 488: 'Entree', 489: 'Entree'}}

and thank you very much i have been stuck here for two days!!!

CodePudding user response:

IIUC you could try the following code. The code use NaN for cases where there is an issue with Entree/Sortie times.

import pandas as pd
import numpy as np

from pprint import pprint as pp    # For displaying as dataframe

def hours_worked(tf):
    '''
        Find the elapsed time between accumulated Entree/Sortie in DataFrame
        
        Return nan when there is a issue with start/stop times
    '''
    start = tf['Event Point']=='Entree'
    stop =  tf['Event Point']=='Sortie'
    if start.sum() == stop.sum():   # Check that we have a matching number of Entree & Sortie
        starts = tf[start]['date_time']
        stops = tf[stop]['date_time']
        
        if (stops.values >= starts.values ).all():
            elapsed = (stops.values - starts.values).sum()
            # Return value hours
            return elapsed.astype('timedelta64[s]').astype(np.int32)/3600.
        else:
            # Not all Entree/Sortie pairs, not all start times are greater than corresponding stop time
            return np.nan
    else:
        # Number of Entree/Sortie doesn't match
        return np.nan
    
def agg_hours(tf):
    '''
        Aggregate hours worked by day and personnel ID
    
    '''
    return (tf
            .assign(date_time = pd.to_datetime(tf['Date And Time'])) # Date & time from string
            .sort_values(['date_time'])                       # Sort by datetimes together
            .groupby([pd.Grouper(key='date_time',freq='1D'),  # Group by Day
                   'Personnel ID'])                           # and ID
            .apply(hours_worked)                              # Get hours worked           
            .to_frame()                                       # To Dataframe
            .rename(columns = {0:"Hours Worked"}))            # renaming column 0

Usage

result = agg_hours(df)     # Aggregate hours for the dataframe
pp(result)                 # Show results

Test Results

Using posted data from question.

Test 1 Using 1 day of data

                            Hours Worked
    date_time  Personnel ID              
    2020-10-15 41                     NaN
               42                1.362778
               43                7.440000
               44                8.597500

Test 2 Multiple days of data

                         Hours Worked
date_time  Personnel ID              
2020-08-04 42                8.320000
           43                7.869722
           44                7.715833
2020-08-05 41                6.418889
           42                8.665556
           43                9.303611
           44                8.168611
2020-08-06 41                6.790556
           42                8.169444
           43                8.299167
           44                7.617222
2020-08-07 41                0.650278
           42                8.396111
           43                7.498333
           44                7.779444
2020-08-10 41                7.660833
           42                8.212222
           43                7.410000
           44                7.867222
2020-08-11 41                5.269444
           42                7.961667
           43                7.459167
           44                7.792222
2020-08-12 41                4.970556
           42                8.666667
           43                7.615833
           44                     NaN
2020-08-13 41                4.732500
           42               10.511667
           43                     NaN
           44                3.845833
2020-08-17 43                8.262222
2020-08-18 43                7.482500
2020-08-19 43                6.083889
2020-08-24 42                8.330278
           43                7.318333
2020-08-25 42                7.406944
           43                7.347778
           44                7.074444
2020-08-26 41                7.293333
           42                7.693611
           43                7.196389
           44                7.282222
2020-08-27 41                5.100556
           42                8.344167
           43                8.076111
           44                7.611667
2020-08-28 41                7.941944
           42                8.148056
           43                7.232500
           44                6.629722
2020-08-31 41                0.970278
           42                8.254167
           43                7.538889
2020-09-01 42                8.752500
           43                7.764444
2020-09-02 41                8.411111
           42                8.013333
           43                7.356944
2020-09-03 41                6.652778
           42                8.904444
           43                8.335000
           44                7.575556
2020-09-04 41                2.697778
           42                7.389444
           43                7.020000
           44                6.951667
2020-09-07 41                8.174167
           42                7.707500
           43                7.250278
           44                7.528889
2020-09-08 41                8.268889
           42                7.838056
           43                7.178889
           44                7.394722
2020-09-09 41                7.985278
           42                8.017222
           43                7.277778
           44                6.917222
2020-09-10 41                7.901111
           42                7.842500
           44                     NaN
2020-09-11 41                3.757500
           42                7.810833
           44                     NaN
2020-09-14 41                2.452778
           42                7.068611
           43                7.535556
           44                7.573056
2020-09-15 41                8.115000
           42                7.977222
           43                7.449167
           44                     NaN
2020-09-16 41                     NaN
           42                7.503611
           43                7.253611
           44                7.188333
2020-09-17 41                2.539167
           42                7.861111
           43                7.286111
           44                     NaN
2020-09-18 41                8.390278
           42                7.528333
           43                7.227500
           44                7.269722
2020-09-21 41                8.725833
           42                7.700556
           43                7.339722
           44                     NaN
2020-09-22 41                8.311389
           42                7.921667
           43                7.381111
           44                7.343056
2020-09-23 41                8.538056
           42                7.698889
           43                7.256111
           44                7.187500
  • Related