[英]Issue combining 5 minute time intervals into hourly time intervals
這是我第一次發帖,如果我的帖子不是最好的,請原諒...
我以前看過這個,將我的 5 分鍾間隔合並為每小時間隔,並顯示每小時的音量。 將 5 分鍾的時間范圍合並為每小時。
這是我正在使用的 CSV 數據的片段。 分隔符是逗號。 數據從 20117 年 6 月一直持續到 2021 年底。
日期戳 | 時間戳 | det_vol |
---|---|---|
2017-06-01 | 13:45 | 582 |
2017-06-01 | 13:50 | 592 |
2017-06-01 | 13:55 | 578 |
2017-06-01 | 14:00 | 544 |
2017-06-01 | 14:05 | 521 |
我使用pd.read_csv()
讀取數據並通過值排序以獲得 2017 年 8 月的所有體積讀數
vds2 = vds2[(vds2['datestamp'].dt.year == 2017) & (vds2['datestamp'].dt.month == 8)]
vds2 = vds2.rename(columns={'det_vol': 'Volume'})
vds2['Date'] = pd.to_datetime(vds2['datestamp']).dt.date
vds2['Time'] = pd.to_datetime(vds2['timestamp']).dt.time
vds2 = vds2[['Date','Time','Volume']]
vds2 = vds2.reset_index(drop=True)
這讓我得到了我的最終數據框:
Date Time Volume
0 2017-08-01 00:00 57
1 2017-08-01 00:05 97
2 2017-08-01 00:10 79
3 2017-08-01 00:15 63
4 2017-08-01 00:20 87
... ... ... ...
但是,當我嘗試執行以下操作時,第一行出現錯誤
vds2.index = pd.to_datetime(vds2['Date'] + ' ' + vds2['Time'])
vds2 = vds2.resample('H').agg({'Volume':'sum'})
TypeError: unsupported operand type(s) for +: 'DatetimeArray' and 'str'
我想也許問題是Date
和Time
的格式,這就是我嘗試實施的原因
vds2['Date'] = pd.to_datetime(vds2['Date']).dt.date
vds2['Time'] = pd.to_datetime(vds2['Time']).dt.time
但是我仍然遇到類似的錯誤...
TypeError: unsupported operand type(s) for +: 'datetime.date' and 'str'
我敢肯定這很簡單,但會很感激任何幫助。 謝謝!
>>> df.index = pd.to_datetime(df['datestamp'] + df['timestamp'])
>>> df.resample('H').det_vol.sum()
2017-06-01 13:00:00 1752
2017-06-01 14:00:00 1065
Freq: H, Name: det_vol, dtype: int64
您需要在索引中包含日期時間才能重新采樣。
在測試了您的附加代碼並從您的示例中創建了一個小的“CSV”文件后,我得到了同樣的不需要的錯誤。 我不確定,但在搜索似乎正在發生的事情時,以下代碼行將您的時間戳存儲為字符串。
vds2['Time'] = pd.to_datetime(vds2['timestamp']).dt.time
隨后對“pd.to_datetime”函數的調用失敗了。
當我嘗試各種場景並獲得輸出時,我沒有轉換日期戳或時間戳字段。 我只是讓他們保持原樣。 所以我所做的只是在從“CSV”文件導入數據后重命名列。 以下是我的示例代碼,基於您的程序但不進行任何數據元素轉換。 我只是重命名列。
import pandas as pd
vds2=pd.read_csv('DateTime.csv')
print(vds2)
#vds2 = vds2[(vds2['datestamp'].dt.year == 2017) & (vds2['datestamp'].dt.month == 8)]
vds2 = vds2.rename(columns={'det_vol': 'Volume'})
vds2 = vds2.rename(columns={'datestamp': 'Date'})
vds2 = vds2.rename(columns={'timestamp': 'Time'})
vds2 = vds2[['Date','Time','Volume']]
vds2 = vds2.reset_index(drop=True)
vds2.index = pd.to_datetime(vds2['Date'] + ' ' + vds2['Time'])
vds2.index.name = 'Date and Time'
vds2 = vds2.resample('H').agg({'Volume':'sum'})
rslt_df = vds2[vds2['Volume'] > 0]
print(rslt_df)
在示例數據上運行該程序會在我的終端上產生以下輸出。
@Una:~/Python_Programs/DateTime$ python3 DateTime.py
index datestamp timestamp det_vol
0 0 6/1/2017 13:45 582
1 1 6/1/2017 13:50 592
2 2 6/1/2017 13:55 578
3 3 6/1/2017 14:00 544
4 4 6/1/2017 14:05 521
Volume
Date and Time
2017-06-01 13:00:00 1752
2017-06-01 14:00:00 1065
也許高於我工資等級的人可以更好地解釋當您的程序嘗試將時間數據從您的數據幀轉換為時間戳時發生了什么,但看起來您甚至不需要通過 datetime 函數。 看起來您可以根據自己的喜好重命名列並繼續匯總和處理。
希望有幫助。
問候。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.