首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Vectorize for循环,它结合了两个不同的数据格式。

Vectorize for循环,它结合了两个不同的数据格式。
EN

Stack Overflow用户
提问于 2021-07-26 07:49:10
回答 2查看 112关注 0票数 2

我有一个包含输入数据的两列数据。第一列是开始日期,第二列称为持续时间(分钟)。您可以想到一台从开始运行到start+duration的机器。我想使用这些信息构建一个长度为8760*60的一维数组,其中包含一年中所有的分钟,机器运行的地方应该有一个1,否则为零。下面的MWE完成了这个任务,但是由于for-循环比较慢,我不知道如何将它向量化。

代码语言:javascript
运行
复制
import pandas as pd
import numpy as np

# Start and end of time horizon
start = pd.Timestamp(year=2019, month=1, day=1, hour=0, tz='UTC')
end = pd.Timestamp(year=2019, month=12, day=31, hour=23, minute=59, tz='UTC')

# DataFrame of time horizon
dates = pd.DataFrame(pd.date_range(start, end, freq='min'))

# Starting points
t1 = pd.Timestamp(year=2019, month=1, day=2, hour=0, tz='UTC')
t2 = pd.Timestamp(year=2019, month=1, day=1, hour=0, minute=3, tz='UTC')

# Durations
d1 = 5
d2 = 30

# DataFrame from input data
data = pd.DataFrame(
    data=[
        [t1, d1],
        [t2, d2],
        ],
    columns=[
        'start',
        'duration',
        ]
    )

# Array to be filled
on = np.zeros(8760*60)

# loop over data rows 
for idx in data.index:
    # Start for on array from dates 
    start = dates[dates[0] == data.loc[idx, 'start']].index[0]
    
    # Duration from data
    duration = data.loc[idx, 'duration']

    # Put 1s in the on array from start to start+duration
    on[start: start+duration] = 1
EN

Stack Overflow用户

回答已采纳

发布于 2021-07-26 10:35:12

这对你有用吗?

代码语言:javascript
运行
复制
idx = pd.date_range(pd.Timestamp('2019-01-01', tz='UTC'),
                    pd.Timestamp('2019-12-31', tz='UTC'),
                    freq='1min')
df = pd.DataFrame({'on': 0}, index=idx)

def to_mins(row):
    return set(pd.date_range(row['start'], periods=row['duration'], freq='1min'))

idx_on = set().union(*data[['start', 'duration']].apply(to_mins, axis='columns'))
df.loc[idx_on] = 1
on = df.on.values

如果持续时间可能导致2019年以外的时间戳,您可以使用:

代码语言:javascript
运行
复制
def to_min_range(row):
    return set(
        m 
        for m in pd.date_range(row['start'], periods=row['duration'], freq='1min')
        if m.year == 2019
    )
票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68526220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档