Python DateTime Index - невозможно удалить даты - ValueError: не удалось преобразовать строку в метку времени - PullRequest
0 голосов
/ 19 октября 2018

Я не могу удалить даты из моего кадра данных после второго фильтра индекса даты и времени.Я получаю эту ошибку: ValueError: could not convert string to Timestamp.

Создание базового набора данных (сначала просто запустите этот фрагмент, для создания кадра данных потребуется около 45 секунд):

#2016
url = "https://www.ndbc.noaa.gov/view_text_file.php?filename=42040h2016.txt.gz&dir=data/historical/stdmet/"
data_csv = urlopen(url)
df = pd.read_csv(data_csv, delim_whitespace=True, index_col=0, parse_dates=True)


############################################################
# Buoy 42040 Data Preparation
############################################################

#Remove useless variables
df.drop(['WDIR', 'WSPD', 'GST', 'WVHT', 'DPD', 'APD', 'MWD', 'PRES', 'VIS', 'TIDE', 'VIS'], 
        axis = 1, inplace = True)

#Reset Index
df.reset_index(level=0, inplace=True)

#remove 1st row contains erronous characters
df = df.iloc[1:]

#Rename Year column
df = df.rename(columns={'#YY': 'YY'})

#drop rows containing headers / strings 
df.iloc[24070:24080,:] #24077
df = df[df.MM.str.contains("mo") == False]

#Create date column then merge
df['Date'] = df[df.columns[0:3]].apply(lambda x: '/'.join(x.dropna().astype(int).astype(str)),axis=1)
df['Time'] = df[df.columns[3]].str.cat(df[df.columns[4]], sep=':')
df['Date.Time'] = df['Date'] + ':' + df['Time']

#Convert to numeric from objects 
df = df.convert_objects(convert_numeric=True)

#Convert Date and Date.Time to pd.datetime classes
df['Date'] = pd.to_datetime(df['Date'], format = '%Y/%m/%d')
df['Date.Time'] = pd.to_datetime(df['Date.Time'], format='%Y/%m/%d:%H:%M', utc=True)

#Convert dataframe index to a datetime index, then drop other times
df = df.set_index('Date.Time')
df.drop(['hh', 'mm', 'Time', 'Date'], axis = 1, inplace = True)
#Remove 2014 data
df = df[df['YY'] != 2014]

Проверьте, еслиуказатель даты и времени работает.Выглядит хорошо.

df.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 111356 entries, 2015-01-01 00:50:00+00:00 to 2018-09-04 00:00:00+00:00
Data columns (total 6 columns):
YY      111356 non-null int64
MM      111356 non-null int64
DD      111356 non-null int64
ATMP    89208 non-null float64
WTMP    110737 non-null float64
DEWP    89221 non-null float64
dtypes: float64(3), int64(3)
memory usage: 5.9 MB

Удалите данные за февраль и март 2016 года из фрейма данных, поскольку они плохие.Здесь нет проблем:

df = df.loc[(df.index <= '2016-01-31') | (df.index >= '2016-04-01')]

Удалите декабрь 2016 года из фрейма данных, потому что это тоже плохо, но тогда возникает проблема:

df = df.loc[(df.index <= '2016-11-31') | (df.index >= '2017-01-01')]

ValueError: could not convert string to Timestamp

Если есть альтернативный метод, кто-то хотел быпредположить, что это будет наиболее ценно.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

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

df = df[df.MM.str.contains("mo") == False]

Спасибо за просмотр этого поста!

0 голосов
/ 19 октября 2018

Вы назначили первое свидание 31 ноября 2016 года, но в ноябре только 30 дней.Измените эту строку на df = df.loc[(df.index <= '2016-11-30') | (df.index >= '2017-01-01')] и посмотрите, решит ли она вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...