Найдите недостающие часы из одного столбца и сохраните как текстовый файл в Python

#python #pandas #dataframe #numpy #datetime

#python #pandas #фрейм данных #numpy #дата и время

Вопрос:

Учитывая набор данных следующим образом:

Дата NO2 SO2 O3
0 2018/11/14 10:00 9 25 80
1 2018/11/14 12:00 9 26 88
2 2018/11/14 13:00 8 26 88
3 2018/11/14 14:00 8 34 88
4 2018/11/14 15:00 8 37 89
5 2018/11/14 17:00 8 72 40
6 2018/11/14 18:00 8 56 50
7 2018/11/14 19:00 7 81 22

Я хотел бы найти недостающие часы из date столбца и сохранить эти недостающие даты как missing_date.txt .

Мой код:

 df = df.set_index(pd.to_datetime(df['date']))
df = df.sort_index()
df = df.drop(columns=['date'])
df = df.resample('H').first().fillna(np.nan)
missing = df[df['NO2'].isnull()]
np.savetxt('./missing_date.txt', missing.index.to_series(), fmt='%s')
 

Out:

 2018-11-14T11:00:00.000000000
2018-11-14T16:00:00.000000000
 

Проблема:

  1. не лаконично, возможно, нужно улучшить;
  2. формат даты не ожидается следующим образом: 2018/11/14 11:00 , 2018/11/14 16:00 .

Как я мог улучшить приведенный выше код? Спасибо.

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

1. date Уникальны ли они?

2. Да, они уникальны.

Ответ №1:

Используйте DataFrame.asfreq работу с уникальными датами и временем:

 #create sorted DatetimeIndex
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date').sort_index()

#if possible duplicates
#df = df.resample('H').first()

#if not duplicates
df = df.asfreq('H')

missing = df[df['NO2'].isna()]
 

Для записи в файл возможно сначала преобразовать значения DatetimeIndex для пользовательского формата DatetimeIndex.strftime , а затем записать с помощью numpy или pandas:

 s = missing.index.strftime('%Y/%m/%d %H:%M').to_series()

np.savetxt('./missing_date.txt', s, fmt='%s')
 

 s.to_csv('./missing_date.txt', index=False)