Pandas 用“a”中的数据转换数据;“列表列”;转换为长格式的时间序列。使用三列:[数据列表]+;[时间戳]+;[持续时间]

Pandas 用“a”中的数据转换数据;“列表列”;转换为长格式的时间序列。使用三列:[数据列表]+;[时间戳]+;[持续时间],pandas,dataframe,timestamp,nested-lists,datetimeindex,Pandas,Dataframe,Timestamp,Nested Lists,Datetimeindex,其目的是将具有列表列作为数据列(因此每行仅具有一个时间戳和持续时间)的数据帧转换为具有每个单个项的datetimeindex的长格式时间序列 结果,数据不再具有每行的序列/列表,而只有一个值列 df_test = pd.DataFrame({'timestamp': [1462352000000000000, 1462352100000000000, 1462352200000000000, 1462352300000000000], 'list': [[1,2,

其目的是将具有列表列作为数据列(因此每行仅具有一个时间戳和持续时间)的数据帧转换为具有每个单个项的datetimeindex的长格式时间序列

结果,数据不再具有每行的序列/列表,而只有一个值列

df_test = pd.DataFrame({'timestamp': [1462352000000000000, 1462352100000000000, 1462352200000000000, 1462352300000000000],
                'list': [[1,2,1,9], [2,2,3,0], [1,3,3,0], [1,1,3,9]],
                'duration_sec': [3.0, 3.0, 3.0, 3.0]})

tdi = pd.DatetimeIndex(df_test.timestamp)
df_test.set_index(tdi, inplace=True)
df_test.drop(columns='timestamp', inplace=True)
df_test.index.name = 'datetimeindex'
输出:

目的是:

                     value
datetimeindex
2016-05-04 08:53:20  1
2016-05-04 08:53:21  2
2016-05-04 08:53:22  1
2016-05-04 08:53:23  9
2016-05-04 08:55:00  2
2016-05-04 08:55:01  2
2016-05-04 08:55:02  3
2016-05-04 08:55:03  0
2016-05-04 08:56:40  1
2016-05-04 08:56:41  3
2016-05-04 08:56:42  3
2016-05-04 08:56:43  0
2016-05-04 08:58:20  1
2016-05-04 08:58:21  1
2016-05-04 08:58:22  3
2016-05-04 08:58:23  9
请注意,这不仅仅意味着每个项目需要1秒,这只是为了简化示例。相反,它是一个序列中的大约4个项目,其具有例如3.0秒的给定持续时间(也可能因行而异),并且其中每个序列的第一个项目总是在“时间0”处开始,这意味着每个项目的秒数应该像[3.0秒/(4-1)个项目]=1秒那样计算

####

背景:

该示例显示了到Datetimeindex的转换,因为这使它适合季节分解(),请参阅 第一次搜索成功

在这里,生成的df如下所示:

df_test2 = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'], index_col='date')
输出:

然后很容易应用seational_decompose()-->加法分解:

result_add = seasonal_decompose(df_test2['value'], model='additive', extrapolate_trend='freq')
绘图:

现在,上述df_测试也需要相同的方法。

首先使用计数器,然后将计数器按和添加到df。索引:

df_test = df_test.explode('nestedList')
df_test.index += pd.to_timedelta(df_test.groupby(level=0).cumcount(), unit='s')

print (df_test)
                    nestedList  duration_sec
2016-05-04 08:53:20          1           3.0
2016-05-04 08:53:21          2           3.0
2016-05-04 08:53:22          1           3.0
2016-05-04 08:53:23          9           3.0
2016-05-04 08:55:00          2           3.0
2016-05-04 08:55:01          2           3.0
2016-05-04 08:55:02          3           3.0
2016-05-04 08:55:03          0           3.0
2016-05-04 08:56:40          1           3.0
2016-05-04 08:56:41          3           3.0
2016-05-04 08:56:42          3           3.0
2016-05-04 08:56:43          0           3.0
2016-05-04 08:58:20          1           3.0
2016-05-04 08:58:21          1           3.0
2016-05-04 08:58:22          3           3.0
2016-05-04 08:58:23          9           3.0
编辑:

EDIT2由asker编写:

通过生成的df,现在可以简单地应用decompose(),这是最终目标:

result_add = seasonal_decompose(x=df_test['nestedList'], model='additive', extrapolate_trend='freq', period=int(len(df_test)/2))
plt.rcParams.update({'figure.figsize': (5,5)})
result_add.plot().suptitle('Additive Decompose', fontsize=22)
plt.show()

首先使用计数器,然后将计数器按和添加到
测向索引中

df_test = df_test.explode('nestedList')
df_test.index += pd.to_timedelta(df_test.groupby(level=0).cumcount(), unit='s')

print (df_test)
                    nestedList  duration_sec
2016-05-04 08:53:20          1           3.0
2016-05-04 08:53:21          2           3.0
2016-05-04 08:53:22          1           3.0
2016-05-04 08:53:23          9           3.0
2016-05-04 08:55:00          2           3.0
2016-05-04 08:55:01          2           3.0
2016-05-04 08:55:02          3           3.0
2016-05-04 08:55:03          0           3.0
2016-05-04 08:56:40          1           3.0
2016-05-04 08:56:41          3           3.0
2016-05-04 08:56:42          3           3.0
2016-05-04 08:56:43          0           3.0
2016-05-04 08:58:20          1           3.0
2016-05-04 08:58:21          1           3.0
2016-05-04 08:58:22          3           3.0
2016-05-04 08:58:23          9           3.0
编辑:

EDIT2由asker编写:

通过生成的df,现在可以简单地应用decompose(),这是最终目标:

result_add = seasonal_decompose(x=df_test['nestedList'], model='additive', extrapolate_trend='freq', period=int(len(df_test)/2))
plt.rcParams.update({'figure.figsize': (5,5)})
result_add.plot().suptitle('Additive Decompose', fontsize=22)
plt.show()

duration_sec列在这个问题上有什么意义吗?@EddyG之所以需要它,是因为您需要找出“开始”之后的下一个时间戳,而您只知道每行的下一个时间戳。我没有关于每个序列中项目之间时间的任何其他信息。因此,我认为下一个时间戳只能通过“+duration/len(sequence)”来计算。duration\u sec列在这个问题中有什么意义吗?@EddyG它是必需的,因为您需要找出在“start”之后的下一个时间戳,您只知道每行一次。我没有关于每个序列中项目之间时间的任何其他信息。因此,我认为下一个时间戳只能通过“+duration/len(sequence)”来计算。至于@EddyG的评论,这只是目前的秒数。如果我在序列中有50个项目,持续时间为30秒,这将不再有效。我必须加上30/50秒,而不是一整秒。我现在接受这一点太早了,我的问题不清楚。虽然现在的答案在问题发布的几分钟内就已经很精彩了。@Lorenz-有一件事我不清楚,子列表中有4个值,但是有
duration\u sec
列除以
3
?所以它的意思是默认情况下,长度减去
1
?因此,解决方案是
df_test=df_test.explode('nestedList')
size=df_test.groupby(level=0)['nestedList'].transform('size').sub(1).div(df_test['duration_sec'))
df_test.index+=pd.to_timedelta(df_test.groupby(level=0.cumcount()*size,unit='s'))
我将更改此问题,这样持续时间将不再计算角色,而是按每个项目设置一个通常的持续时间,无论其顺序如何。给我几分钟。好了,完成了,现在问题中包括了全局持续时间变量。请使用
groupby(level=0)。cumcount()*size
更改为
groupby(level=0)。cumcount()*duration
在您的答案中,在前面引入
duration=1
,并删除输出中现在不需要的duration\u sec列。ThxI将检查。我会让你知道,如果这解决了它,它可能会有助于获得你现在提供的每个项目的持续时间。看起来很有希望,给我一些时间。至于@EddyG的评论,现在只剩几秒钟了。如果我在序列中有50个项目,持续时间为30秒,这将不再有效。我必须加上30/50秒,而不是一整秒。我现在接受这一点太早了,我的问题不清楚。虽然现在的答案在问题发布的几分钟内就已经很精彩了。@Lorenz-有一件事我不清楚,子列表中有4个值,但是有
duration\u sec
列除以
3
?所以它的意思是默认情况下,长度减去
1
?因此,解决方案是
df_test=df_test.explode('nestedList')
size=df_test.groupby(level=0)['nestedList'].transform('size').sub(1).div(df_test['duration_sec'))
df_test.index+=pd.to_timedelta(df_test.groupby(level=0.cumcount()*size,unit='s'))
我将更改此问题,这样持续时间将不再计算角色,而是按每个项目设置一个通常的持续时间,无论其顺序如何。给我几分钟。好了,完成了,现在问题中包括了全局持续时间变量。请使用
groupby(level=0)。cumcount()*size
更改为
groupby(level=0)。cumcount()*duration
在您的答案中,在前面引入
duration=1
,并删除输出中现在不需要的duration\u sec列。ThxI将检查。我会让你知道,如果这解决了它,它可能会有助于获得你现在提供的每个项目的持续时间。看起来很有希望,给我点时间。
df_test = df_test.explode('nestedList') 
sizes = df_test.groupby(level=0)['nestedList'].transform('size').sub(1)
duration = df_test['duration_sec'].div(sizes) 
df_test.index += pd.to_timedelta(df_test.groupby(level=0).cumcount() * duration, unit='s') 
result_add = seasonal_decompose(x=df_test['nestedList'], model='additive', extrapolate_trend='freq', period=int(len(df_test)/2))
plt.rcParams.update({'figure.figsize': (5,5)})
result_add.plot().suptitle('Additive Decompose', fontsize=22)
plt.show()