猿问

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 分钟的间隔。我希望在同一数据帧(或新数据帧)中生成新行,如下所示:


 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

日期列是 type datetime[64], key 是objectvol 是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 条记录。这为我提供DatetimeIndex了数据框中所有开始时间和结束时间值的时间序列,间隔为 15 分钟。


在此之后,我尝试在数据框中作为lst新列传递,如下所示:unpackdf


df['unpack'] = lst

我的想法是,如果我可以将这些值作为 df 中的新列,我可以使用此解决方案将它们提取为行。但是这个过程是行不通的。


我怎么能用熊猫做到这一点?


呼啦一阵风
浏览 105回答 2
2回答

宝慕林4294392

我的五十美分:首先重新创建示例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]})循环开始时间,为每个 start_time 创建一个具有所需索引的新数据帧,并将它们存储在一个列表中。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     vol0   2018-08-23 00:00:00 2018-08-23 01:30:00 abcd_eg 0.921   2018-08-23 00:15:00 2018-08-23 01:30:00 abcd_eg 0.922   2018-08-23 00:30:00 2018-08-23 01:30:00 abcd_eg 0.923   2018-08-23 00:45:00 2018-08-23 01:30:00 abcd_eg 0.924   2018-08-23 01:00:00 2018-08-23 01:30:00 abcd_eg 0.925   2018-08-23 01:15:00 2018-08-23 01:30:00 abcd_eg 0.926   2018-08-23 01:30:00 2018-08-23 01:30:00 abcd_eg 0.927   2018-08-23 00:15:00 2018-08-23 01:45:00 defg_x2 0.278   2018-08-23 00:30:00 2018-08-23 01:45:00 defg_x2 0.279   2018-08-23 00:45:00 2018-08-23 01:45:00 defg_x2 0.2710  2018-08-23 01:00:00 2018-08-23 01:45:00 defg_x2 0.2711  2018-08-23 01:15:00 2018-08-23 01:45:00 defg_x2 0.2712  2018-08-23 01:30:00 2018-08-23 01:45:00 defg_x2 0.2713  2018-08-23 01:45:00 2018-08-23 01:45:00 defg_x2 0.27  

慕的地8271018

我看到您添加了新信息。也许这就是你要找的,如果 15 分钟间隔的数量是固定的,那么你可以试试这个。Edit2:现在,它也适用于非固定的 15 分钟间隔。import pandas as pdgap = '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 = 0to_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+=1df_final = df.reindex(df.index.repeat(to_repeat))df_final['start_time'] = inddf_final.reset_index(inplace=True)df_final.drop(columns='index',inplace=True)print(df_final)输出            start_time             end_time      key   vol0  2018-08-23 00:00:00  2018-08-23 01:30:00  abcd_eg  0.921  2018-08-23 00:15:00  2018-08-23 01:30:00  abcd_eg  0.922  2018-08-23 00:30:00  2018-08-23 01:30:00  abcd_eg  0.923  2018-08-23 00:45:00  2018-08-23 01:30:00  abcd_eg  0.924  2018-08-23 01:00:00  2018-08-23 01:30:00  abcd_eg  0.925  2018-08-23 01:15:00  2018-08-23 01:30:00  abcd_eg  0.926  2018-08-23 01:30:00  2018-08-23 01:30:00  abcd_eg  0.927  2018-08-23 00:15:00  2018-08-23 01:45:00  defg_x2  0.278  2018-08-23 00:30:00  2018-08-23 01:45:00  defg_x2  0.279  2018-08-23 00:45:00  2018-08-23 01:45:00  defg_x2  0.2710 2018-08-23 01:00:00  2018-08-23 01:45:00  defg_x2  0.2711 2018-08-23 01:15:00  2018-08-23 01:45:00  defg_x2  0.2712 2018-08-23 01:30:00  2018-08-23 01:45:00  defg_x2  0.2713 2018-08-23 01:45:00  2018-08-23 01:45:00  defg_x2  0.2714 2018-08-24 00:45:00  2018-08-24 01:00:00  whef_98  0.8715 2018-08-24 01:00:00  2018-08-24 01:00:00  whef_98  0.8716 2018-08-24 00:30:00  2018-08-24 02:45:00  tuyr_23  0.9017 2018-08-24 00:45:00  2018-08-24 02:45:00  tuyr_23  0.9018 2018-08-24 01:00:00  2018-08-24 02:45:00  tuyr_23  0.9019 2018-08-24 01:15:00  2018-08-24 02:45:00  tuyr_23  0.9020 2018-08-24 01:30:00  2018-08-24 02:45:00  tuyr_23  0.9021 2018-08-24 01:45:00  2018-08-24 02:45:00  tuyr_23  0.9022 2018-08-24 02:00:00  2018-08-24 02:45:00  tuyr_23  0.9023 2018-08-24 02:15:00  2018-08-24 02:45:00  tuyr_23  0.9024 2018-08-24 02:30:00  2018-08-24 02:45:00  tuyr_23  0.9025 2018-08-24 02:45:00  2018-08-24 02:45:00  tuyr_23  0.90
随时随地看视频慕课网APP

相关分类

Python
我要回答