Получить диапазон часов между днями - PullRequest
1 голос
/ 07 мая 2020

У меня есть pandas фрейм данных, содержащий временные метки. И я хотел бы знать часы между первой записью дня и последней, вот что у меня есть:

time      | Hour
----------|---------
2010-01-01| 06:44:00 
2010-01-01| 06:28:00
2010-01-01| 14:47:00
2010-01-02| 06:44:00
2010-01-02| 06:28:00
2010-01-02| 15:57:00

это то, что я хочу

---------------------
Day        | Hours
-----------|---------
2010-01-01 | 08:03:00
2010-01-02 | 09:13:00

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Вы можете использовать повторную выборку и найти разницу между минимальным и максимальным значениями для каждого дня. Перед чтением данных из вашего примера я удалил имя столбца «Час», так что остался только один столбец с именем «Время».

df = pd.read_clipboard(sep=r"[ ]{2,}").set_index(pd.DatetimeIndex(df['time']))

df_rs_min = df.resample('D').agg('min')

df_rs_max = df.resample('D').agg('max')

merged_df = df_rs_max.merge(df_rs_min, left_on=df_rs_max.index, right_on=df_rs_min.index)

merged_df['diff'] = pd.to_datetime(merged_df['time_x']) - pd.to_datetime(merged_df['time_y'])

merged_df = merged_df[['key_0', 'diff']]

merged_df.rename(columns={'key_0': 'day', 'diff':'hours' }, inplace=True)

print(merged_df)

day hours
0   2010-01-01  00:16:00
1   2010-01-02  09:29:00
0 голосов
/ 07 мая 2020

Я предлагаю следующее:

# First I recreate a similar dataframe:
import pandas as pd
df = pd.DataFrame({"day": ["2010-01-01", "2010-01-01","2010-01-02","2010-01-02", "2010-01-02"],
                   "hour": pd.date_range("2010-01-01 06:44:00", freq="h", periods=5)})
df.hour = df.hour.dt.time

Мой df:

         day      hour
0  2010-01-01  06:44:00
1  2010-01-01  07:44:00
2  2010-01-02  08:44:00
3  2010-01-02  09:44:00
4  2010-01-02  10:44:00

Чтобы получить разницу во времени между первым и последним часом I groupby день, получите первый и последний значения, а затем вычтите их:

df = df.sort_values(["day", "hour"])
df["hour"] = pd.to_datetime(df["day"] + " " + df["hour"].astype("str"))
df = df.groupby("day").hour.agg(["first", "last"])
df = df["last"] - df["first"]
df = df.reset_index().rename(columns={0:'hours'})

И результат:

         day    hours
0  2010-01-01 01:00:00
1  2010-01-02 02:00:00
...