Как преобразовать временные ряды в%M:%S.%f начиная с 00:00.00

#python #pandas #numpy

#python #панды #numpy

Вопрос:

У меня есть результат 20-минутного измерения с нерегулярной частотой (разница во времени между каждой точкой измерения различна), сохраненный в csv-файле с метками времени unix и временем в формате iso:

 unix_timestamp      time_iso                        data  
1602159331.000000   2020-10-08T12:15:31.00 00:00    10
1602159331.152680   2020-10-08T12:15:31.15 00:00    3
1602159331.222114   2020-10-08T12:15:31.22 00:00    5
...                 ...                             ...
1602160747.73929    2020-10-08T12:35:31.00 00:00    7
  

Фактическое время не имеет значения. Единственным релевантным временем является timedelta по сравнению с первой точкой измерения. Итак, на самом деле мне нужны эти данные:

 time(%M:%S.%f)     data
00:00.00           10
00:00.15           3
00:00.22           5
...                ...
00:20.00           7
  

Есть ли хороший способ преобразовать время в нужный формат, но сохранить информацию о том, что это тип данных, связанный со временем?

Комментарии:

1. df['time'] = df['time_iso'] - df['time_iso'].iloc[0] ?

Ответ №1:

Используйте:

 df['time_iso'] = pd.to_datetime(df['time_iso'])

df['time_iso'] = df['time_iso'].sub(df['time_iso'].iat[0])
print (df)
   unix_timestamp               time_iso  data
0    1.602159e 09        0 days 00:00:00    10
1    1.602159e 09 0 days 00:00:00.150000     3
2    1.602159e 09 0 days 00:00:00.220000     5
3    1.602161e 09        0 days 00:20:00     7
  

Затем для пользовательского формата используйте пользовательскую функцию:

 df['time_iso'] = pd.to_datetime(df['time_iso'])


def format_timedelta(x):
    ts = x.total_seconds()
    hours, remainder = divmod(ts, 3600)
    minutes, seconds = divmod(remainder, 60)
    return ('{:02d}:{:05.2f}').format(int(minutes), seconds) 


df['time_iso'] = df['time_iso'].sub(df['time_iso'].iat[0]).apply(format_timedelta)
print (df)
   unix_timestamp  time_iso  data
0    1.602159e 09  00:00.00    10
1    1.602159e 09  00:00.15     3
2    1.602159e 09  00:00.22     5
3    1.602161e 09  20:00.00     7
  

Комментарии:

1. Спасибо. Это сработало, как принято, но я думаю, что теперь я потерял информацию о том, что это время. Я попытался отобразить данные с помощью bokeh, но безуспешно. Есть ли способ преобразовать его в тип, в котором я могу иметь желаемый формат, но сохранить информацию о том, что это время?

2. @19yc93 — Можете ли вы добавить df['time_iso'] = pd.to_datetime(df['time_iso'], format='%M:%S.%f').dt.time после моего решения?

3. Теперь мы приближаемся. Теперь формат%H:%M:%S.%f , так что это 00:00:00.00 00:00:00.15 00:00:00.22 00:20:00.00

4. @19yc93 Проблема в том, что время всегда имеет часы, поэтому при необходимости его нельзя удалить.

5. @19yc93 При необходимости datetime.time всегда нужен HH: MM: SS или HH: MM: SS.f

Ответ №2:

Первый импорт datetime

 from datetime import datetime
  

Приведите временную метку unix к целому числу

 ts = int(unix_timestamp)
  

Последнее, отформатируйте временную метку

 datetime.utcfromtimestamp(ts).strftime('%H:%M:%S')  # Printing this gives output as following HOURS:MINUTES:SECONDS