#python #pandas #dataframe #datetime
#python #pandas #фрейм данных #дата и время
Вопрос:
У меня есть столбец pandas, содержащий только временные метки в порядке возрастания. Я использую to_datetime() для работы с этим столбцом, но он автоматически добавляет один и тот же день по всему столбцу без увеличения при достижении полуночи. Итак, как я могу логически указать ему увеличивать день, когда он пересекает полночь.
rail[8].iloc[121]
rail[8].iloc[100]
вывод этих значений:
TIME 2020-11-19 00:18:00
Name: DSG, dtype: datetime64[ns]
TIME 2020-11-19 21:12:27
Name: KG, dtype: datetime64[ns]
тогда iloc[121]
как должно быть 2020-11-20
Пример данных выглядит так:
df1.columns = df1.iloc[0]
ids = df1.loc['TRAIN NO'].unique()
df1.drop('TRAIN NO',axis=0,inplace=True)
rail = {}
for i in range(len(ids)):
rail[i] = df1.filter(like=ids[i])
rail[i] = rail[i].reset_index()
rail[i].rename(columns={0:'TRAIN NO'},inplace=True)
rail[i] = pd.melt(rail[i],id_vars='TRAIN NO',value_name='TIME',var_name='trainId')
rail[i].drop(columns='trainId',inplace=True)
rail[i].rename(columns={'TRAIN NO': 'CheckPoints'},inplace=True)
rail[i].set_index('CheckPoints',inplace=True)
rail[i].dropna(inplace=True)
rail[i]['TIME'] = pd.to_datetime(rail[i]['TIME'],infer_datetime_format=True)
CheckPoints TIME
DEPOT 2020-11-19 05:10:00
KG 2020-11-19 05:25:00
RI 2020-11-19 05:51:11
RI 2020-11-19 06:00:00
KG 2020-11-19 06:25:44
... ...
DSG 2020-11-19 23:41:50
ATHA 2020-11-19 23:53:56
NBAA 2020-11-19 23:58:00
NBAA 2020-11-19 00:01:00
DSG 2020-11-19 00:18:00
Может кто-нибудь мне помочь ..!
Комментарии:
1. Похоже, у вас есть только отметка времени HH: MM: SS, а не дата в данных. Можете ли вы опубликовать, как выглядит столбец и как вы преобразуете его в datetime?
2. Okay…so У меня есть csv-файл, содержащий только данные формата временных меток HH: MM: SS
3. Проверьте редактирование для разделения и вывода данных
Ответ №1:
Вы можете проверить, где timedelta последующих временных меток меньше 0 (= изменения даты). Используйте итоговую сумму и добавьте ее в качестве временного интервала (дней) в свой столбец даты и времени:
import pandas as pd
df = pd.DataFrame({'time': ["23:00", "00:00", "12:00", "23:00", "01:00"]})
# cast time string to datetime, will automatically add today's date by default
df['datetime'] = pd.to_datetime(df['time'])
# get timedelta between subsequent timestamps in the column; df['datetime'].diff()
# compare to get a boolean mask where the change in time is negative (= new date)
m = df['datetime'].diff() < pd.Timedelta(0)
# m
# 0 False
# 1 True
# 2 False
# 3 False
# 4 True
# Name: datetime, dtype: bool
# the cumulated sum of that mask accumulates the booleans as 0/1:
# m.cumsum()
# 0 0
# 1 1
# 2 1
# 3 1
# 4 2
# Name: datetime, dtype: int32
# ...so we can use that as the date offset, which we add as timedelta to the datetime column:
df['datetime'] = pd.to_timedelta(m.cumsum(), unit='d')
df
time datetime
0 23:00 2020-11-19 23:00:00
1 00:00 2020-11-20 00:00:00
2 12:00 2020-11-20 12:00:00
3 23:00 2020-11-20 23:00:00
4 01:00 2020-11-21 01:00:00
Комментарии:
1. Хорошо, позвольте мне проверить, но также просмотрите мое редактирование, если это поможет понять метод.. Я проверю, работает ли ваш способ, так как он выглядит великолепно ..!
2. @Brainiac: я составил образец df, но сам метод должен хорошо интегрироваться; в вашем коде
df
было быrail[i]
, и, конечно, вам не нужно создавать дополнительный столбец даты и времени, вы можете выполнить операцию ВОВРЕМЯ3. Браво, человек, который выполнил свою работу, не могли бы вы уделить минуту своего драгоценного времени, чтобы я понял, как работает этот код…
4. @Brainiac: да, внес правку. пояснения в
# comments
.