преобразуйте time_utc в местное время с помощью панд часовых поясов

#python #pandas #dataframe

#питон #панды #фрейм данных

Вопрос:

Я хочу преобразовать переменное время UTC в местное время в соответствии с Local_timezone переменной.

У меня есть фрейм данных time_df с переменной TIMEZONE и второй data_df фрейм данных с переменной time_utc . Я хочу создать переменную local_time в своем фрейме данных.

TIMEZONE является строкой и time_utc является датой-временем.

Я делаю это вот так:

 local_timezone = time_df['TIMEZONE']  data_df.loc[data_df['time_utc'].tz_convert(local_timezone), 'local_time']  

У меня есть эта ошибка:

 TypeError: index is not a valid DatetimeIndex or PeriodIndex  

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

1. можете ли вы показать некоторые примеры ваших данных в фрейме данных?

2. Пожалуйста, пришлите результаты print(local_timezone.head().to_dict(), local_timezone.shape, data_df.head().to_dict(), data_df.shape)

3. Конечно, вот пример моего time_utc : 2021-12-03 01:33:00 00:00 и моего TIMEZONE : Europe/Paris . Извините, я не могу добавить экран моего фрейма данных.

4. Конечно, результат таков : {0: 'Europe/Paris', 1: 'Europe/Paris', 2: 'Europe/Paris'} (3,) {'equipement': {0: 'R6401', 1: 'R6401', 2: 'R6401', 3: 'R6401', 4: 'R6401'}, 'product_name_x': {0: 'XX', 1: 'XX', 2: 'XX', 3: 'XX', 4: 'XX'}, 'Batch_Continuous': {0: 'CONTINUOUS', 1: 'CONTINUOUS', 2: 'CONTINUOUS', 3: 'CONTINUOUS', 4: 'CONTINUOUS'}, 'reactor': {0: 'CONT', 1: 'CONT', 2: 'CONT', 3: 'CONT', 4: 'CONT'}, 'product': {0: 'XX', 1: 'XX', 2: 'XX', 3: 'XX', 4: 'XX'}, 'time_utc': {0: Timestamp('2021-12-03 01:33:00 0000', tz='UTC')

Ответ №1:

Допустим, вы сливаетесь data_df с time_df уже. Это означает, что у data_df вас будет time_utc , TIMEZONE , и т. Д.

напр.

 local_timezone = time_df['TIMEZONE'] local_timezone = local_timezone.to_frame('TIMEZONE') data_df = pd.concat([data_df , local_timezone], axis=1)  

Чтобы преобразовать часовой пояс time_utc в местное время, используйте apply() для применения часового пояса к каждому значению.

 def set_timezone(row):  return row['time_utc'].tz_convert(row['TIMEZONE'])  data_df['local_time'] = data_df.apply(lambda x: set_timezone(x), axis = 1)  

выход

До:

 gt;gt;gt; data_df  time_utc TIMEZONE 0 2021-12-03 01:33:00 00:00 Europe/Paris 1 2021-12-03 03:50:00 00:00 Europe/Paris  

После:

 gt;gt;gt; data_df['local_time'] = data_df.apply(lambda x: set_timezone(x), axis = 1) gt;gt;gt; data_df  time_utc TIMEZONE local_time 0 2021-12-03 01:33:00 00:00 Europe/Paris 2021-12-03 02:33:00 01:00 1 2021-12-03 03:50:00 00:00 Europe/Paris 2021-12-03 04:50:00 01:00  

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

1. Спасибо вам за ваш ответ. Когда я использую apply, у меня возникает эта ошибка KeyError: 'TIMEZONE' . На самом деле time_UTC и TIMEZONE находятся в разных кадрах данных.

2. поэтому вам нужно concat сначала просмотреть первый раздел кода выше. или вам нужно манипулировать ими без объединения?

3. без объединения их в один и тот же фрейм данных это немного сложно сделать в разных фреймах данных.

4. Спасибо, при объединении их в один и тот же фрейм данных это работает !