#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
Проблема:
- не лаконично, возможно, нужно улучшить;
- формат даты не ожидается следующим образом:
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)