首先,我建議使用對整個陣列/系列pd.to_datetime
,所以這將是:
pd.to_datetime(['10:15:00','11:15:00','12:15:00','13:15:00']).time
不是
[pd.to_datetime(i).time() for i in ['10:15:00','11:15:00','12:15:00','13:15:00']]
其次,你對格式是正確的。作爲pd.to_datetime
的文件中說,它的速度要快得多(由x5-10次)使用
pd.to_datetime(['25-DEC-2016 09:15:00', '25-DEC-2016 09:15:00'],
format='%d-%b-%Y %H:%M:%S')
不是
pd.to_datetime(['25-DEC-2016 09:15:00', '26-DEC-2016 09:15:00'],
infer_datetime_format=True)
現在考慮您的數據框:
df = pd.DataFrame({'col1': [1, 2, 3, 2],
'mydate': ['25-DEC-2016 09:15:00',
'25-DEC-2016 11:15:00',
'26-DEC-2016 11:15:00',
'26-DEC-2016 12:15:00']})
>>>
col1 mydate
0 1 25-DEC-2016 09:15:00
1 2 25-DEC-2016 11:15:00
2 3 26-DEC-2016 11:15:00
3 2 26-DEC-2016 12:15:00
你可以首先將mydate
列轉換爲實際的datetime
系列:
df['mydate'] = pd.to_datetime(df.mydate, format='%d-%b-%Y %H:%M:%S')
然後你就可以通過dt
存取訪問date
和time
字段(以及更多):
df.mydate.dt.date
>>>
0 2016-12-25
1 2016-12-25
2 2016-12-26
3 2016-12-26
df.mydate.dt.time
>>>
0 09:15:00
1 11:15:00
2 11:15:00
3 12:15:00
因此,在計算切片時,你可以使用:
for time in times:
slice = df[df.mydate.dt.time < time]
print(time, slice, sep='\n')
>>>
10:15:00
col1 mydate
0 1 2016-12-25 09:15:00
11:15:00
col1 mydate
0 1 2016-12-25 09:15:00
12:15:00
col1 mydate
0 1 2016-12-25 09:15:00
1 2 2016-12-25 11:15:00
2 3 2016-12-26 11:15:00
13:15:00
col1 mydate
0 1 2016-12-25 09:15:00
1 2 2016-12-25 11:15:00
2 3 2016-12-26 11:15:00
3 2 2016-12-26 12:15:00
注意你得到的實際上並不是切片,因爲它們有重疊的記錄,所以你可能想用類似的東西:
for start, end in zip(times, times[1:]):
slice = df[(start <= df.mydate.dt.time) & (df.mydate.dt.time <= end)]
作爲最後一點,您正在嘗試使用for循環完成的任務可以使用來自熊貓的group by操作獲得。你只需要準備一個mytime
列,只有與時俱進:
df['mytime'] = df.mydate.dt.time
groups = df.groupby('mytime')
for group_key, group_df in groups:
print(group_key, group_df, sep='\n')
>>>
09:15:00
col1 mydate mytime
0 1 2016-12-25 09:15:00 09:15:00
11:15:00
col1 mydate mytime
1 2 2016-12-25 11:15:00 11:15:00
2 3 2016-12-26 11:15:00 11:15:00
12:15:00
col1 mydate mytime
3 2 2016-12-26 12:15:00 12:15:00
的好處是,你並不需要在單dataframes操作,但你可以在應用上的每個組相同的操作和聚合同時:
groups.size()
>>>
mytime
09:15:00 1
11:15:00 2
12:15:00 1
groups.sum()
>>>
col1
mytime
09:15:00 1
11:15:00 5
12:15:00 2
爲什麼不只是使用lambda函數來獲取時間子字符串,然後只是使用字符串比較會做。我認爲時間轉換會花費時間。縮短轉換時間將會有所幫助。 – White