簡體   English   中英

根據時間戳將 dataframe 拆分為多個子數據幀

[英]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 bindf corresponding to that bin ):例如,第一個元組是(第一秒的時間戳,與前 2 秒對應的數據)。 所以為了得到DataFrame ,我們可以循環這個 object 並將它們存儲在某個地方,比如dict

請注意,這將產生從數據開始到結束的2 秒間隔,因此根據您的數據,很多都是空的。 但是,如果需要,您可以添加一個步驟來過濾掉它們。

此外,您可以手動將每個切片的DataFrame分配給一個變量,但這會很麻煩(您可能需要為每 2 秒的 bin 編寫一行,而不是一個小循環)。 dictionary不同,您仍然可以將每個DataFrame與可調用名稱相關聯。 您還可以使用OrderedDictlist或任何集合。


您的腳本上有幾點:

  • freq設置為“0.2T”為 12 秒( .2 *60 ); 你寧願做freq="2s"
  • 示例dfdf2是“異相”的,我的意思是一個從奇數(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM