根据时间戳索引创建一个布尔列

时间:2020-11-01 22:05:04

标签: python pandas

我有一个时间序列数据帧,并且如果时间在一天的某些小时之间,则需要创建一个布尔列。我可以获取具有匹配索引位置的数组,但是如何将其转换为布尔列? indexer_between_time方法是执行此计算的最快方法吗?

aapl.csv

df['rth'] = df['bar_start'].apply(lambda dt: '0' if dt.time() < datetime.time(9,30) or dt.time() > datetime.time(15,59) else '1')

下面是我尝试过的一些替代方法。 apply方法不适用于索引。我必须先将索引复制到列。

for i in range(0, len(df.values)):
    dt = df.index[i]
    if dt.time() < datetime.time(9,30) or dt.time() > datetime.time(15,59):
        df.loc['rth', i] = 0
    else:
        df.loc['rth', i] = 1

Loc方法很慢。

void anaru(struct person jodu[4[\]][1])
{
    for(i=0; i<4; i++)
    {
        printf("\n\n\nperson %d........\n", i+1);
        printf("Name: %s\n", jodu[i].name);
        printf("Age: %d\n", jodu[i].age);
        printf("Salary: %.2f\n", jodu[i].salary);
    }
}

int main()
{
    struct person person[4];
    for(i=0; i<4; i++)
    {
        printf("Enter information for person %d\n", i+1);
        printf("Enter name: ");
        scanf("%s", &person[i].name);
        printf("Enter age: ");
        scanf("%d", &person[i].age);
        printf("Enter salary: ");
        scanf("%f", &person[i].salary);
    }


    anaru(person[4]);
}

4 个答案:

答案 0 :(得分:1)

请尝试

df=df.reset_index()#Reset index

#Coerce Datetime to str H:m and compare df['status']=pd.to_datetime(df['Datetime']).dt.strftime('%H:%m').between('09:30','15:39').astype(int)

答案 1 :(得分:0)

在速度更快的地方使用np。

df['rth'] = np.where( (df['bar_start'] < datetime.time(9,30)) | ( df['bar_start'] > datetime.time(15,59)),False, True)

答案 2 :(得分:0)

您可以使用:

df = df.reset_index()
d = pd.to_datetime(df['Datetime'].str[:-6])
m = (d.dt.hour.between(9,15)) & (d.dt.minute.between(30,59))
df['rth'] = np.where(m, 1, 0)
df

答案 3 :(得分:0)

In [15]: range(7.0)
Traceback (most recent call last):
  File "<ipython-input-15-f9ae3bee34e5>", line 1, in <module>
    range(7.0)
TypeError: 'float' object cannot be interpreted as an integer

In [16]: range(np.array([1.2])[0])
Traceback (most recent call last):
  File "<ipython-input-16-d35255ed6111>", line 1, in <module>
    range(np.array([1.2])[0])
TypeError: 'numpy.float64' object cannot be interpreted as an integer