Python Pandas:在两次之间生成datetime,并将结果作为新行传递到数据帧中
我正在使用具有以下结构的数据帧Python Pandas:在两次之间生成datetime,并将结果作为新行传递到数据帧中,python,pandas,Python,Pandas,我正在使用具有以下结构的数据帧df: start_time end_time key vol 0 2018-08-23 00:00:00 2018-08-23 01:30:00 abcd_eg 0.92 1 2018-08-23 00:15:00 2018-08-23 01:45:00 defg_x2 0.27 我试图在开始和结束时间之间产生15分钟的间隔。我
df
:
start_time end_time key vol
0 2018-08-23 00:00:00 2018-08-23 01:30:00 abcd_eg 0.92
1 2018-08-23 00:15:00 2018-08-23 01:45:00 defg_x2 0.27
我试图在开始和结束时间之间产生15分钟的间隔。我希望必须在同一数据帧(或新数据帧)中生成新行,如下所示:
start_time end_time key vol
0 2018-08-23 00:00:00 2018-08-23 01:30:00 abcd_eg 0.92
1 2018-08-23 00:15:00 2018-08-23 01:30:00 abcd_eg 0.92
2 2018-08-23 00:30:00 2018-08-23 01:30:00 abcd_eg 0.92
3 2018-08-23 00:45:00 2018-08-23 01:30:00 abcd_eg 0.92
4 2018-08-23 01:00:00 2018-08-23 01:30:00 abcd_eg 0.92
5 2018-08-23 01:15:00 2018-08-23 01:30:00 abcd_eg 0.92
6 2018-08-23 01:30:00 2018-08-23 01:30:00 abcd_eg 0.92
7 2018-08-23 00:15:00 2018-08-23 01:45:00 defg_x2 0.27
8 2018-08-23 00:30:00 2018-08-23 01:45:00 defg_x2 0.27
9 2018-08-23 00:45:00 2018-08-23 01:45:00 defg_x2 0.27
10 2018-08-23 01:00:00 2018-08-23 01:45:00 defg_x2 0.27
11 2018-08-23 01:15:00 2018-08-23 01:45:00 defg_x2 0.27
12 2018-08-23 01:30:00 2018-08-23 01:45:00 defg_x2 0.27
13 2018-08-23 01:45:00 2018-08-23 01:45:00 defg_x2 0.27
日期列的类型为datetime[64]
,键为object
,卷为float
。
到目前为止,我尝试的是:
b=[]
lst = []
for i, row in df.iterrows():
b = pd.date_range(start=row.start_time, end=row.end_time, freq='15min',closed=None)
lst.append(b)
使用.iterrows()
,因为我有大约125条记录。这为我提供了数据帧中所有开始时间和结束时间值的时间序列,间隔为15分钟
在此之后,我尝试将lst
作为数据帧df
中的新列unpack
传递,如下所示:
df['unpack'] = lst
我的想法是,如果我可以将这些值作为df中的新列,我可以使用它将它们提取为行。但这一过程并不奏效
我怎样才能对熊猫做到这一点 编辑:我看到你添加了新信息。也许这就是你想要的,如果15分钟的间隔是固定的,那么你可以试试这个。 Edit2:现在,它也可以以非固定的15分钟间隔工作
import pandas as pd
gap = '15min'
date_start = ['2018-08-23 00:00:00','2018-08-23 00:15:00','2018-08-24 00:45:00', '2018-08-24 00:30:00']
date_end = ['2018-08-23 01:30:00','2018-08-23 01:45:00','2018-08-24 01:00:00','2018-08-24 02:45:00']
count = 0
to_repeat = []
data = {'start_time':date_start,'end_time':date_end,'key':['abcd_eg','defg_x2', 'whef_98','tuyr_23'],'vol':[0.92,0.27,0.87,0.90]}
df = pd.DataFrame(data)
for _ in zip(date_start, date_end):
temp = pd.date_range(_[0], _[1], freq=gap)
to_repeat.append(len(temp))
if count==0:
ind = temp
else:
ind = ind.append(temp)
count+=1
df_final = df.reindex(df.index.repeat(to_repeat))
df_final['start_time'] = ind
df_final.reset_index(inplace=True)
df_final.drop(columns='index',inplace=True)
print(df_final)
输出
start_time end_time key vol
0 2018-08-23 00:00:00 2018-08-23 01:30:00 abcd_eg 0.92
1 2018-08-23 00:15:00 2018-08-23 01:30:00 abcd_eg 0.92
2 2018-08-23 00:30:00 2018-08-23 01:30:00 abcd_eg 0.92
3 2018-08-23 00:45:00 2018-08-23 01:30:00 abcd_eg 0.92
4 2018-08-23 01:00:00 2018-08-23 01:30:00 abcd_eg 0.92
5 2018-08-23 01:15:00 2018-08-23 01:30:00 abcd_eg 0.92
6 2018-08-23 01:30:00 2018-08-23 01:30:00 abcd_eg 0.92
7 2018-08-23 00:15:00 2018-08-23 01:45:00 defg_x2 0.27
8 2018-08-23 00:30:00 2018-08-23 01:45:00 defg_x2 0.27
9 2018-08-23 00:45:00 2018-08-23 01:45:00 defg_x2 0.27
10 2018-08-23 01:00:00 2018-08-23 01:45:00 defg_x2 0.27
11 2018-08-23 01:15:00 2018-08-23 01:45:00 defg_x2 0.27
12 2018-08-23 01:30:00 2018-08-23 01:45:00 defg_x2 0.27
13 2018-08-23 01:45:00 2018-08-23 01:45:00 defg_x2 0.27
14 2018-08-24 00:45:00 2018-08-24 01:00:00 whef_98 0.87
15 2018-08-24 01:00:00 2018-08-24 01:00:00 whef_98 0.87
16 2018-08-24 00:30:00 2018-08-24 02:45:00 tuyr_23 0.90
17 2018-08-24 00:45:00 2018-08-24 02:45:00 tuyr_23 0.90
18 2018-08-24 01:00:00 2018-08-24 02:45:00 tuyr_23 0.90
19 2018-08-24 01:15:00 2018-08-24 02:45:00 tuyr_23 0.90
20 2018-08-24 01:30:00 2018-08-24 02:45:00 tuyr_23 0.90
21 2018-08-24 01:45:00 2018-08-24 02:45:00 tuyr_23 0.90
22 2018-08-24 02:00:00 2018-08-24 02:45:00 tuyr_23 0.90
23 2018-08-24 02:15:00 2018-08-24 02:45:00 tuyr_23 0.90
24 2018-08-24 02:30:00 2018-08-24 02:45:00 tuyr_23 0.90
25 2018-08-24 02:45:00 2018-08-24 02:45:00 tuyr_23 0.90
我的50美分:
第一个示例df:
df = pd.DataFrame({"start_time": [datetime(2018, 8, 23), datetime(2018, 8, 23, 0, 15)],
"end_time": [datetime(2018, 8, 23, 1, 30), datetime(2018, 8, 23, 1, 45)],
"key": ["abcd_eg", "defg_x2"],
"vol": [0.92, 0.27]})
循环开始时间,使用所需索引为每个开始时间创建一个新的数据帧,并将其存储在列表中
dfs = []
for row in df.itertuples():
part_df = pd.DataFrame(index=pd.DatetimeIndex(start=row.start_time, end=row.end_time, freq='15T'),
data={'end_time': row.end_time, 'key': row.key, 'vol': row.vol})
part_df.index.name = 'start_time'
dfs.append(part_df)
现在连接所有数据帧并重置索引:
result = pd.concat(dfs).reset_index()
给出以下结果:
start_time end_time key vol
0 2018-08-23 00:00:00 2018-08-23 01:30:00 abcd_eg 0.92
1 2018-08-23 00:15:00 2018-08-23 01:30:00 abcd_eg 0.92
2 2018-08-23 00:30:00 2018-08-23 01:30:00 abcd_eg 0.92
3 2018-08-23 00:45:00 2018-08-23 01:30:00 abcd_eg 0.92
4 2018-08-23 01:00:00 2018-08-23 01:30:00 abcd_eg 0.92
5 2018-08-23 01:15:00 2018-08-23 01:30:00 abcd_eg 0.92
6 2018-08-23 01:30:00 2018-08-23 01:30:00 abcd_eg 0.92
7 2018-08-23 00:15:00 2018-08-23 01:45:00 defg_x2 0.27
8 2018-08-23 00:30:00 2018-08-23 01:45:00 defg_x2 0.27
9 2018-08-23 00:45:00 2018-08-23 01:45:00 defg_x2 0.27
10 2018-08-23 01:00:00 2018-08-23 01:45:00 defg_x2 0.27
11 2018-08-23 01:15:00 2018-08-23 01:45:00 defg_x2 0.27
12 2018-08-23 01:30:00 2018-08-23 01:45:00 defg_x2 0.27
13 2018-08-23 01:45:00 2018-08-23 01:45:00 defg_x2 0.27
我面临的问题是,数据帧
df
有大约125条记录,它们具有不同的键
和vol
。我只是以前两排为例。但是有一些记录在开始时间
和结束时间
之间可以有21-30个15分钟的间隔。因此,在这种情况下,到_repeat
将发生变化。您能否建议如何在整个数据帧上同时使用您的解决方案?不过,索引不是问题。是的,看看动态重复的新解决方案。它成功了!你能给我介绍一下解决方案吗?@akshay_rao_19当然。我假设您知道我在本例中使用的df是什么样子的。@akshay_rao_19我将解释循环实现。首先使用zip存储成对的start\u time
和end\u time
元素列表。对于每一对,生成一个相隔15分钟的时间元素的临时向量,并将其存储在ind
中,同时计算该临时向量的长度,并将其存储在中以重复to_repeat
提供有关每行要重复多少次的信息。执行重复和重新索引以创建新的df(重新索引仅用于样式)。将新df中的“开始时间”替换为ind
,您就完成了。重置索引,删除是样式格式。比我的好多了+从我这里得到1。