Найти временной интервал по диапазону значений Python - PullRequest
0 голосов
/ 13 июля 2020

Как лучше всего найти интервалы времени, для которых Value больше 40? Участок: введите описание изображения здесь

df:

            Id          Timestamp               Value   Station
36760387    36761245    2012-06-24 07:50:51.763 21.0    101     
36760388    36761246    2012-06-24 07:50:54.887 21.5    101     
36760405    36761263    2012-06-24 07:51:41.767 21.5    101     
36760406    36761264    2012-06-24 07:51:45.237 24.0    101     
36760409    36761267    2012-06-24 07:51:48.363 32.5    101     
36760414    36761272    2012-06-24 07:51:51.487 37.5    101     
36760415    36761273    2012-06-24 07:51:54.613 40.5    101     
36760416    36761274    2012-06-24 07:51:57.740 42.0    101     
36760421    36761279    2012-06-24 07:52:03.990 42.5    101     
36760422    36761280    2012-06-24 07:52:07.117 43.0    101     
36760461    36761319    2012-06-24 07:53:22.217 43.5    101     
36760462    36761320    2012-06-24 07:53:25.343 44.0    101     
36760561    36761419    2012-06-24 07:55:24.607 43.5    101     
36760562    36761420    2012-06-24 07:55:27.730 43.0    101     
36760700    36761558    2012-06-24 07:59:02.097 42.5    101     
36760701    36761559    2012-06-24 07:59:05.223 42.0    101     
36760820    36761678    2012-06-24 08:02:51.247 41.5    101     
36760821    36761679    2012-06-24 08:02:54.370 41.0    101     
36760943    36761801    2012-06-24 08:05:31.873 40.5    101     
36760944    36761802    2012-06-24 08:05:34.997 40.0    101     
36761061    36761919    2012-06-24 08:08:49.487 39.5    101     
36761062    36761920    2012-06-24 08:08:52.613 39.0    101     
36761282    36762140    2012-06-24 08:13:53.017 38.5    101     
36761283    36762141    2012-06-24 08:13:56.140 38.0    101     
36761458    36762316    2012-06-24 08:17:09.193 37.5    101     
36761459    36762317    2012-06-24 08:17:12.317 37.0    101     
36761577    36762435    2012-06-24 08:20:08.897 36.5    101     
36761578    36762436    2012-06-24 08:20:12.023 36.0    101     
36761713    36762571    2012-06-24 08:22:40.163 36.0    101     
36761714    36762572    2012-06-24 08:22:43.290 38.0    101     
36761730    36762588    2012-06-24 08:22:49.727 38.5    101     
36761731    36762589    2012-06-24 08:22:52.853 39.0    101     
36761744    36762602    2012-06-24 08:22:56.323 39.5    101     
36761745    36762603    2012-06-24 08:22:59.447 41.0    101     
36761747    36762605    2012-06-24 08:23:02.573 42.0    101     
36761757    36762615    2012-06-24 08:23:12.027 42.5    101     
36761758    36762616    2012-06-24 08:23:15.153 43.0    101     
36761769    36762627    2012-06-24 08:23:24.763 43.5    101     
36761770    36762628    2012-06-24 08:23:27.887 44.0    101     
36761833    36762691    2012-06-24 08:24:43.083 44.5    101     
36761834    36762692    2012-06-24 08:24:46.207 45.0    101     
36762007    36762865    2012-06-24 08:28:45.873 44.5    101 
36762008    36762866    2012-06-24 08:28:48.997 44.0    101     
36762136    36762994    2012-06-24 08:32:13.660 43.5    101     
36762137    36762995    2012-06-24 08:32:16.787 43.0    101 
36762259    36763117    2012-06-24 08:35:19.867 42.5    101 
36762260    36763118    2012-06-24 08:35:22.993 42.0    101     
36762549    36763407    2012-06-24 08:41:00.403 41.5    101     

Я хотел бы записывать каждый интервал в такую ​​таблицу:

Time_Start              Value1        Time_End                 Value2   Interval
2012-06-24 07:51:54.613 40.5          2012-06-24 08:05:34.997  40       (Time_End - Time_Start)
...

1 Ответ

1 голос
/ 13 июля 2020

Вот способ сделать это, в основном используя shift:

df["start_of_range"] = (df.Value >= 40) & (df.Value.shift() < 40)
df["end_of_range"] =   (df.Value >= 40) & (df.Value.shift(-1) < 40)
t = df[df["start_of_range"] | df["end_of_range"] ]


# t is now all the rows which are either at the beginning or at the 
# end of a range. We now want to 'fold it' into two - odd rows
# are start of ranges, and even rows are end of ranges. 
t.index=range(len(t))
starts = t[t.index % 2 == 0][["Timestamp", "Value"]]
ends = t[t.index % 2 == 1][["Timestamp", "Value"]]
t = pd.concat([starts.reset_index(), ends.reset_index()], axis=1)

t = t.drop("index", axis=1)
t.columns = ["start_window", "Value", "end_window", "Value"]
print(t)

Результат:

             start_window  Value              end_window  Value
0 2012-06-24 07:51:54.613   40.5 2012-06-24 08:05:34.997   40.0
1 2012-06-24 08:22:59.447   41.0                     NaT    NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...