Исключение, которое вы видите, связано с тем, что вы пытаетесь оценить серию с множеством разных записей в сравнении с набором отдельных условий.Вкратце, давайте посмотрим, что вы делаете:
Анализ ошибок (почему бы не сделать это так):
Сначала вы взяли пандстолбец dataframe, а затем преобразует его в datetime, который, конечно, также возвращает столбец (серию).
time = pd.to_datetime(df.dttm_utc) # Convert content of dttm_utc COLUMN to datetime
# This returns a dataframe COLUMN / series
Month = time.dt.month # Convert content of your COLUMN/series to month
Day = time.dt.day # Convert content of your COLUMN/series to month
Hour = time.dt.Hour # Convert content of your COLUMN/series to month
Ваша ошибка: Затем вы пытаетесь оценить конкретные условия для ряда:
if (Month == whatever_condition):
do_something()
Однако вы не можете сравнить одно условие с серией, по крайней мере, не так.Python не знает, какую запись в серии вы имеете в виду, поскольку некоторые значения в ней могут отличаться от других.Это означает, что для некоторых элементов серии условие может быть выполнено, для других - нет.Следовательно, ValueError: The truth value of a series is ambiguous
.
То, что вы хотите сделать вместо этого:
Оценить элемент за элементом, в идеале векторизованным способом.Мое предложение: оставаться в фрейме данных панд все время:
df['Datetime'] = pd.to_datetime(df['dttm_utc']) # Add second column with datetime format
df['Month'] = df.Datetime.dt.month # Extract month and add to new column
# Same for day
df.loc[(df.Month < 3), 'InDayLightSavings'] = False
# You can add multiple conditions here
# Finally, your filter:
df.loc[(df.InDayLightSavings == True), 'Time'] = df['Time'] - dt.timedelta(hours=1)
# dt when import datetime as dt, else just datetime
Дальнейшее чтение здесь , здесь , здесь и здесь.