[英]Split dataframe into many sub-dataframes based on timestamp
我有一個大的 csv 格式如下:
timestamp,name,age
2020-03-01 00:00:01,nick
2020-03-01 00:00:01,john
2020-03-01 00:00:02,nick
2020-03-01 00:00:02,john
2020-03-01 00:00:04,peter
2020-03-01 00:00:05,john
2020-03-01 00:00:10,nick
2020-03-01 00:00:12,john
2020-03-01 00:00:54,hank
2020-03-01 00:01:03,peter
我將 csv 加載到 dataframe 中:
df = pd.read_csv("/home/test.csv")
然后我想每 2 秒創建多個數據幀。 例如:
df1 包含:
2020-03-01 00:00:01,nick
2020-03-01 00:00:01,john
2020-03-01 00:00:02,nick
2020-03-01 00:00:02,john
df2 包含:
2020-03-01 00:00:04,peter
2020-03-01 00:00:05,john
等等。
我使用以下命令實現了拆分時間戳:
full_idx = pd.date_range(start=df['timestamp'].min(), end = df['timestamp'].max(), freq ='0.2T')
但是我如何存儲這些吐出的數據幀? 如何將基於時間戳的數據集拆分為多個數據幀?
可能這個問題可以幫助我們: Pandas:時間戳索引四舍五入到最接近的第 5 分鍾
import numpy as np
import pandas as pd
df = pd.read_csv("test.csv")
df['timestamp'] = pd.to_datetime(df['timestamp'])
ns2sec=2*1000000000 # 2 seconds in nanoseconds
# next we round our timestamp to every 2nd second with rounding down
timestamp_rounded = df['timestamp'].astype(np.int64) // ns2sec
df['full_idx'] = pd.to_datetime(((timestamp_rounded - timestamp_rounded % 2) * ns2sec))
# store array for each unique value of your idx
store_array = []
for value in df['full_idx'].unique():
store_array.append(df[df['full_idx']==value][['timestamp', 'name', 'age']])
.resample()
怎么樣?
#first loading your data
>>> import pandas as pd
>>>
>>> df = pd.read_csv('dates.csv', index_col='timestamp', parse_dates=True)
>>> df.head()
name age
timestamp
2020-03-01 00:00:01 nick NaN
2020-03-01 00:00:01 john NaN
2020-03-01 00:00:02 nick NaN
2020-03-01 00:00:02 john NaN
2020-03-01 00:00:04 peter NaN
#resampling it at a frequency of 2 seconds
>>> resampled = df.resample('2s')
>>> type(resampled)
<class 'pandas.core.resample.DatetimeIndexResampler'>
#iterating over the resampler object and storing the sliced dfs in a dictionary
>>> df_dict = {}
>>> for i, (timestamp,df) in enumerate(resampled):
>>> df_dict[i] = df
>>> df_dict[0]
name age
timestamp
2020-03-01 00:00:01 nick NaN
2020-03-01 00:00:01 john NaN
現在來解釋一下...
resample()
非常適合根據時間重新DataFrames
(我經常使用它來對時間序列數據進行下采樣),但它可以簡單地用於切割DataFrame
,就像你想做的那樣。 遍歷由df.resample()
生成的resampler
器 object 返回一個元組(bin 的name of the bin
, df corresponding to that bin
):例如,第一個元組是(第一秒的時間戳,與前 2 秒對應的數據)。 所以為了得到DataFrame
,我們可以循環這個 object 並將它們存儲在某個地方,比如dict
。
請注意,這將產生從數據開始到結束的每2 秒間隔,因此根據您的數據,很多都是空的。 但是,如果需要,您可以添加一個步驟來過濾掉它們。
此外,您可以手動將每個切片的DataFrame
分配給一個變量,但這會很麻煩(您可能需要為每 2 秒的 bin 編寫一行,而不是一個小循環)。 與dictionary
不同,您仍然可以將每個DataFrame
與可調用名稱相關聯。 您還可以使用OrderedDict
或list
或任何集合。
您的腳本上有幾點:
freq
設置為“0.2T”為 12 秒( .2 *60
); 你寧願做freq="2s"
df
和df2
是“異相”的,我的意思是一個從奇數(1-2 秒)開始在 2 秒內分箱,而一個從偶數(4-5 秒)開始。 因此,您提到的date_range
不會創建這些 bin,它會從 0-1s、2-3s、4-5s ... 或 1-2s、3-4s、5-6s ... 創建dfs
,具體取決於它從哪個時間戳開始。 對於后一點,您可以使用.resample()
的base
參數來設置重采樣的“階段”。 所以在上面的例子中, base=0
會在偶數上啟動 bin, base=1
會在奇數上啟動 bin。
這是假設您對這種類型的分箱沒問題 - 如果您真的希望 1-2 秒和 4-5 秒在不同的分箱中,我相信您將不得不做一些更復雜的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.