#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