AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78682653
Accepted
Swawa
Swawa
Asked: 2024-06-28 21:06:48 +0800 CST2024-06-28 21:06:48 +0800 CST 2024-06-28 21:06:48 +0800 CST

Novo erro de cálculo de coluna com base na coluna datetime e timedelta com base em dois dataframes

  • 772

Eu tenho um dataframe python df_A cuja coluna de índice contém dados inteiros e representa um carimbo de data / hora na linha de segundos (pode não ter um gradiente estritamente monotônico).

E eu tenho outro dataframe df_B que contém apenas um conjunto de dados. Uma de suas "células" me dá um horário de início. Meu objetivo é pegar esse horário de início do df_B, colocá-lo na primeira linha de uma nova coluna a ser criada no df_A e iniciar um cálculo a partir daí com base na linha do índice.

A coluna de índice de df_A contém números inteiros como este:

Int64Index([ 2374,  2376,  2377,  2378,  2379,  2380,  2381,  2383,  2384,
             2385,
            ...
            10531, 10532, 10533, 10535, 10536, 10537, 10538, 10539, 10540,
            10541],
           dtype='int64', name='TimePeak', length=7107)

df_B fica assim:

df_B = pd.DataFrame([['2021-07-08T08:56:46.637', 590, 0, 4270.29]], columns=['BeginTime', 'Altitude', 'Status', 'Duration'])

insira a descrição da imagem aqui

Primeiro, obtenho meu valor de tempo inicial por df_B: Para cálculos adicionais, preciso que a entrada do tipo string "BeginTime" seja compatível com números inteiros de df_B.index. É por isso que converto tudo para o formato data e hora:

# Gain the first entry of the new dataframe column 'time'
df_A['time'].iloc[0] = pd.to_datetime(df_B.BeginTime)

Mas a primeira entrada não é colocada na primeira linha da nova coluna, pois produz uma mensagem ValueError: Could not convert object to NumPy datetime Não entendo por que não foi convertida. Devo definir seu conteúdo mais especificamente? Outros valores de data e hora deste formato são convertidos sem qualquer mensagem de erro para o formato AAAA-MM-DD hh:mm:ss.sss (sem o "T" no meio)

Então eu calcularia o tempo delta:

# calculate timedelta according to the index column values starting in the second
# row as the first row has no reference to be calculated from
for i in range(1, len(df_A)):
    df_A['deltaT'][i] = df_A.index[i] - df_A.index[i-1] 

Isso me dá um erro importante para deltaT. Por que?

Posso definir uma coluna vazia primeiro:

df_A['deltaT'] = pd.to_timedelta(pd.Series(dtype='float'), unit='s')
for i in range(1, len(df_A)):
    df_A['deltaT'][i] = df_A.index[i] - df_A.index[i-1] 

Mas isso terminaria em uma série de advertências:


See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df_A['deltaT'][i] = df_A.index[i] - df_A.index[i-1] 

O que eu poderia suprimir: pd.options.mode.chained_assignment = None mas acho que o problema principal está localizado em algum lugar acima do código... (?)

Depois eu calcularia as linhas adicionais com base na diferença deltaT por duas linhas consecutivas:

# calculate the further rows 
for i in range (1, len(df_A)):
    df_A[i,'time'] = df_A.iloc[i-1]['time'] + pd.to_timedelta(df_A.iloc[i]['deltaT'](1, unit='s'))
df_A['time']

Mas este cálculo também não será realizado.

O código completo:

import pandas as pd
import numpy as np

# df_B:
df_B = pd.DataFrame([['2021-07-08T08:56:46.637', 590, 0, 4270.29]], columns=['BeginTime', 'Altitude', 'Status', 'Duration'])

# df_A
df_A = pd.DataFrame([[2374, 4.5],[2376, 5.7],[2377,23.0],[2378,9.2],[2379,18.7],[2380,10.4],[2381,12.2],[2383,23.9],[2384,21.6],
             [2385, 12.1]], columns=['TimePeak', 'data'])
df_A.set_index('TimePeak') # indeed, the index is set earlier due to a merge of several *.csv files

# Gain the first entry of the new dataframe column 'time' and convert it to timedate format
df_A['time'].iloc[0] = pd.to_datetime(df_B.BeginTime)

# calculate timedelta according to the index column values starting in the second
# row as the first row has no reference to be calculated from
for i in range(1, len(df_A)):
    df_A['deltaT'][i] = df_A.index[i] - df_A.index[i-1] 

# calculate the further rows 
for i in range (1, len(df_A)):
    df_A[i,'time'] = df_A.iloc[i-1]['time'] + pd.to_timedelta(df_A.iloc[i]['deltaT'](1, unit='s'))
df_A['time']

Também tentei redefinir o índice, mas não funcionou. Alguma dica para eu entender onde fui enganado?

A saída final deve ficar assim:

insira a descrição da imagem aqui

pandas
  • 1 1 respostas
  • 21 Views

1 respostas

  • Voted
  1. Best Answer
    mozway
    2024-06-28T21:16:12+08:002024-06-28T21:16:12+08:00

    A lógica exata não é clara, mas é quase certo que você não precisa de um loop.

    Se bem entendi, você deseja iniciar o tempo com o valor a partir de df_Bentão incrementar 1s para cada linha. Então use date_range:

    df_A['time'] = pd.date_range(df_B.loc[0, 'BeginTime'], periods=len(df_A), freq='s')
    

    Ou, mais próximo da sua abordagem original, se quiser usar o índice como referência:

    df_A['time'] = (pd.Timestamp(df_B.loc[0, 'BeginTime'])
                   +pd.TimedeltaIndex(df_A.index-df_A.index[0], unit='s')
                   )
    

    Saída:

       TimePeak  data                    time
    0      2374   4.5 2021-07-08 08:56:46.637
    1      2376   5.7 2021-07-08 08:56:47.637
    2      2377  23.0 2021-07-08 08:56:48.637
    3      2378   9.2 2021-07-08 08:56:49.637
    4      2379  18.7 2021-07-08 08:56:50.637
    5      2380  10.4 2021-07-08 08:56:51.637
    6      2381  12.2 2021-07-08 08:56:52.637
    7      2383  23.9 2021-07-08 08:56:53.637
    8      2384  21.6 2021-07-08 08:56:54.637
    9      2385  12.1 2021-07-08 08:56:55.637
    
    • 1

relate perguntas

  • Extraia a string da linha duplicada, remova a duplicata, forneça a contagem de strings [duplicada]

  • percorrendo colunas para gerar countplot () seaborn

  • Como posso obter o máximo de cada linha em uma coluna de índice

  • Crie uma matriz dask com pyarrow dtype

  • Divida as entradas no dataframe [duplicado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve