要將它們以所需的格式保存為每個用戶的 csv 檔案,讓我們output按其多索引的第一級分組并將每個組保存在 for-loop 中:
for user_id, group in output.groupby(level=0):
group.to_csv(
f'user_{user_id}.csv',
index=False,
date_format='%a %d/%m %I:%M %p'
)
在這里,我們使用index=False洗掉索引,'%a %d/%m %I:%M %p'并將日期另存為Weekday Day/Month Hour:Minute (AM/PM),請參閱前面提到的格式代碼以獲取詳細資訊。
更新
在閱讀了您的真實資料后,我得出一個結論,即您的實際問題是資料統一和清理。
關于統一
在原始帖子中,日期表示為Thu 1/09 9:10 AM,其中day在month之前。但是您的真實資料中的日期總是以前一個月的形式呈現,例如,這是 9 月 1 日,或者是 9 月 13 日,或者是 9 月 2 日。這意味著您在此處獲得的答案可能不適用于您的真實資料。Sun 9/01 9:10 AM9/13/22 9:05 AM2022-09-02 09:18:42
此外,您在一個檔案中以兩種不同的格式表示日期:Sun 9/01 9:10 AMvs. 9/13/22 9:05 AM,這肯定會對您的問題的任何答案造成嚴重問題。
所以在我看來,您需要做的第一件事就是統一檔案中的日期格式。
關于清潔
我認為如何洗掉重復項不是問題。至于近乎重復的記錄,由您決定如何定義接近的記錄以及應該如何將這些接近的記錄重用為一個,無論是min、max、mean等。而且我敢肯定,清潔資料不是問題堆疊溢位; 它看起來更像是自由職業者的任務。
關于通過 AM/PM 確定到達/離開時間
這種方法也會導致錯誤。您有一些到達時間在 12:00:00 之后或出發時間在 12:00:00 之前的記錄。因此,這里的任何答案都不會涵蓋這些記錄。也許更好的方法是確定哪個差異是有意義的,并在此基礎上提取到達和離開的時間。您還必須決定如何解釋中午前后的時間,以防它在某些日子里是用戶的單一時間記錄。
uj5u.com熱心網友回復:
另一種方法,將列轉換為日期時間并使用它。嘗試:
df
Date
0 Thu 1/09 9:10 AM
1 Thu 1/09 6:10 PM
2 Fri 2/09 9:04 AM
3 Fri 2/09 6:02 PM
df['Date'] = pd.to_datetime(df['Date'] ' 2022', format='%a %d/%m %H:%M %p %Y')
df['day'] = df['Date'].dt.date
df['time'] = df['Date'].dt.time
df.groupby('day').agg(InTime=('time', 'first'), OutTime=('time', 'last')).reset_index()
day InTime OutTime
0 2022-09-01 09:10:00 06:10:00
1 2022-09-02 09:04:00 06:02:00
uj5u.com熱心網友回復:
一個可能的解決方案,基于pandas.DataFrame.pivot:
# separate day from time
df[['Date1', 'Date2']] = df['Date'].str.split('(?<=\d)\s(?=\d)', expand=True)
# create column with colnames for the new columns to be created by pivot
df['names'] = ['inTime', 'OutTime'] * (len(df)//2)
(df.pivot(index='Date1', columns='names', values='Date')
.reset_index(drop=True).iloc[:,::-1])
輸出:
names inTime OutTime
0 Fri 2/09 9:04 AM Fri 2/09 6:02 PM
1 Thu 1/09 9:10 AM Thu 1/09 6:10 PM
如果資料集沒有時間從早到晚排序,則解決方案可能如下:
# separate day from time
df[['Date1', 'Date2', 'Date3']] = df['Date'].str.split(
'(?<=\d)\s(?=\d)|\s(?=.M$)', expand=True)
# this is needed if the times are no sorted in the initial dataset
df = df.sort_values(['Date1', 'Date3', 'Date2'])
# create column with colnames for the new columns to be created by pivot
df['names'] = ['inTime', 'OutTime'] * (len(df)//2)
(df.pivot(index='Date1', columns='names', values='Date')
.reset_index(drop=True).iloc[:,::-1])
完整代碼:
import pandas as pd
import numpy as np
from io import StringIO
text = """
Date
Thu 1/09 9:10 AM
Thu 1/09 6:10 PM
Fri 2/09 9:04 AM
Fri 2/09 6:02 PM
"""
df = pd.read_csv(StringIO(text), sep='\s{2,}', engine='python')
# separate day from time
df[['Date1', 'Date2']] = df['Date'].str.split('(?<=\d)\s(?=\d)', expand=True)
# create column with colnames for the new columns to be created by pivot
df['names'] = ['inTime', 'OutTime'] * (len(df)//2)
df = (df.pivot(index='Date1', columns='names', values='Date')
.reset_index(drop=True).iloc[:,::-1])
print(df)
uj5u.com熱心網友回復:
查看您共享的 csv,很明顯,日期格式存在問題(不一致,但目前不是問題)和重復條目。
請注意,有些行缺少上午時間,有些行缺少下午時間。假設用戶在早上進入并在下午退出,我制作了一個簡單的回圈來檢查每個用戶的 IN 和 OUT 時間,并在缺少條目的情況下添加“缺失”。為每個用戶生成一個資料幀,然后將所有資料幀連接起來。如果您愿意,您可以對最終資料框進行排序,但您必須首先標準化資料格式。我沒有做這一步,因為它不是問題的一部分,沒有它也可以解決問題。
import pandas as pd
input_csv = '/Users/alec/Downloads/python-split-dates-data/sandbox.csv'
df = pd.read_csv(input_csv)
print(df)
User Date
0 11 Sun 9/01 9:10 AM
1 3 Sun 9/01 9:10 AM
2 4 Sun 9/01 9:10 AM
3 2 Sun 9/01 9:23 AM
4 5 Sun 9/01 9:39 AM
.. ... ...
339 12 9/30/22 5:55 PM
340 5 9/30/22 6:01 PM
341 6 9/30/22 6:04 PM
342 11 9/30/22 6:09 PM
343 4 9/30/22 6:19 PM
[344 rows x 2 columns]
cleaned_df = []
for user, group in df.drop_duplicates().groupby('User'):
am = [] #store AM entries
pm = [] #store PM entries
for i, row in group.iterrows():
if row.Date.endswith('AM'):
am.append(row.Date)
elif row.Date.endswith('PM'):
while len(am) <= len(pm):
am.append('missing IN') #add missing
while len(pm) < len(am)-1:
pm.append('missing OUT') #add missing
pm.append(row.Date)
assert len(am) == len(pm) #double check data is consistent
_df = pd.DataFrame({'User':[user]*len(am), 'IN':am, 'OUT':pm})
cleaned_df.append(_df)
new_df = pd.concat(cleaned_df)
print(new_df)
User IN OUT
0 2 Sun 9/01 9:23 AM Sun 9/01 5:55 PM
1 2 Wed 9/02 9:20 AM Wed 9/02 5:46 PM
2 2 Wed 9/03 9:24 AM Wed 9/03 5:46 PM
3 2 Mon 9/05 9:23 AM Mon 9/05 5:40 PM
4 2 Thu 9/06 9:26 AM Thu 9/06 5:49 PM
.. ... ... ...
0 12 missing IN 9/23/22 5:54 PM
1 12 9/27/22 10:24 AM 9/27/22 1:34 PM
2 12 9/28/22 9:01 AM 9/28/22 5:51 PM
3 12 9/29/22 9:08 AM 9/29/22 5:52 PM
4 12 9/30/22 9:16 AM 9/30/22 5:55 PM
[182 rows x 3 columns]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/513110.html
上一篇:在R中將日期更改為yyyy-mm
