Найдите строку фрейма данных, в которой значение даты и времени столбца соответствует значению даты и времени другого стPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Найдите строку фрейма данных, в которой значение даты и времени столбца соответствует значению даты и времени другого ст

Сообщение Anonymous »

Я пытаюсь найти строку, в которой значение даты и времени столбца «c2» соответствует значению даты и времени другого столбца «c1», и вернуть значение из соответствующей строки «rtn» как «новое» значение. Это работает со следующим примером.
В реальной задаче второй столбец даты содержит дату, ранее предсказанное значение даты. Существует несколько таких прогнозов, сделанных на дату 1d, дату 2d и т. д. В конечном итоге я хочу создать график, сравнивающий окончательное значение со всеми прогнозируемыми в будущем значениями.

Код: Выделить всё

from datetime import  datetime#, timedelta #, date #

import pandas as pd
import numpy as np

df = pd.DataFrame({'date1': [10, 11, 12], 'date2': [12, 11, 10],  'rtn':[21,22,23],'new':[99,99,99]})

print(df['date1'].isin(df['date2']) )
print(f'date1 \n{df.date1 == df.date2}')

datatypes = df.dtypes
print(df.dtypes)
print(df)

for index, row in df.iterrows():
row['new']=df.loc[df['date2'] ==row['date1'],'rtn'].iloc[0]

datatypes = df.dtypes
print(df.dtypes)
print(df)
Однако, когда я использую даты даты и времени, а не целые числа, это не так (я включил закомментированные попытки преобразования даты и времени в строку, число с плавающей запятой и даже целое число, как указано выше, и это не удалось)

Код: Выделить всё

from datetime import  datetime#, timedelta #, date #

import pandas as pd
import numpy as np

date_time_ref = datetime(year=2020, month=1, day=1, hour=00, minute=00, second=00)
date_time_date11 = datetime(year=2024, month=10, day=20, hour=1, minute=00, second=00)
date_time_date12 = datetime(year=2024, month=10, day=21, hour=13, minute=00, second=00)
date_time_date13 = datetime(year=2024, month=10, day=22, hour=1, minute=00, second=00)
date_time_date23 = date_time_date11  #this is to ensure the test dates are identical
date_time_date22 = date_time_date12  #this is to ensure the test dates are identical
date_time_date21 = date_time_date13  #this is to ensure the test dates are identical

print(f'Test {date_time_date11 == date_time_date21}')
print(f'Test {date_time_date11 == date_time_date23}')

df = pd.DataFrame({'date1': [date_time_date11, date_time_date12, date_time_date13], 'date2': [date_time_date21, date_time_date22, date_time_date23],  'rtn':[21,22,23],'new':[99,99,99]})

datatypes = df.dtypes
print(df.dtypes)
print(df)

for index, row in df.iterrows():
row['new']=df.loc[df['date2'] ==row['date1'],'rtn'].iloc[0]

datatypes = df.dtypes
print(df.dtypes)
print(df)

print(df['date1'].isin(df['date2']) )
print(f'date1 \n{df.date1 == df.date2}')
Я попробовал следующие преобразования в дату и время без каких-либо изменений в результате.

Код: Выделить всё

df = df.reset_index()  # make sure indexes pair with number of rows

# 1. convert to strings for comparison
df['date1'] = df['date1'].dt.strftime('%Y-%m-%d %H') #':%M:%S')
df['date2'] = df['date2'].dt.strftime('%Y-%m-%d %H') #:%M:%S')

# 2. convert the datetime column to an ordinal
df['date1'].apply(lambda x:x.toordinal())
df['date2'].apply(lambda x:x.toordinal())

# 3. convert the datetime column to an integer divide the resulting integer by the number of    nanoseconds in a second
df['date1'] = df['date1'].astype(int)/ 10**9
df['date2'] = df['date2'].astype(int)/ 10**9

# 4. convert datetime to seconds
pd.to_timedelta(df.date1).dt.total_seconds()
pd.to_timedelta(df.date2).dt.total_seconds()

# 5. convert datetime to float64
df['date1'] = df['date1'] - date_time_ref
df['date2'] = df['date2'] - date_time_ref
df['date1'] = df['date1'] / np.timedelta64(1, 'h')
df['date2'] = df['date2'] / np.timedelta64(1, 'h')

# 6. convert to float64 above to int64
df['date1'] = df['date1'].astype(np.int64)
df['date2'] = df['date2'].astype(np.int64)
Значения «new» должны быть 23, 22 21, как при запуске исходного кода. Но когда значения входных данных date1 и date2 изменяются с типа «int» на тип «datetime», код больше не дает правильный вывод.
Почему один и тот же код работает для одного типа ввода (int), а не для другого тип ввода (дата и время) меня озадачивает.

Подробнее здесь: https://stackoverflow.com/questions/791 ... lumns-date
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»