Python Используйте функцию if: ValueError: Значение истины для серии неоднозначно.Используйте a.empty, a.bool (), a.item (), a.any () или a.all () - PullRequest
0 голосов
/ 13 июня 2018

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

df = pd.read_csv(‘file.csv’)
# convert the string into a datetime object
time = pd.to_datetime(df.dttm_utc)
Month=time.dt.month
Day=time.dt.day
Hour=time.dt.Hour
InDayLightSavings=True
if (Month<3): InDayLightSavings=False
if (Month==3) and (Day<11) and (Hour<2): InDayLightSavings=False
if (Month>11): InDayLightSavings=False
if (Month==11) and (Day>4)and (Hour>=2): InDayLightSavings=False

if (InDayLightSavings):
    time=time-datetime.timedelta(hours=1)

И он возвращает, как вы уже догадались, истинное значение Серии неоднозначно.Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().Я использовал это с меткой времени, изменив ее на ISO8601 раньше, и этот метод работает, но, очевидно, он не работает для серий.И я попытался добавить .any (), и это не работает.Я также изменяю и на & как предложено в другой ветке.Часть моего file.csv выглядит так, работает до конца 2012 года:

timestamp	  dttm_utc	          value
1325376300	2012-01-01 0:05:00	16.9444
1325376600	2012-01-01 0:10:00	16.6837
1325376900	2012-01-01 0:15:00	16.6837
1325377200	2012-01-01 0:20:00	16.9444
1325377500	2012-01-01 0:25:00	16.1623
1325377800	2012-01-01 0:30:00	16.6837
Желаемый результат: Включить - пример данных с интервалом в 15 минут

3/13/2016 1:00	51
3/13/2016 1:15	48
3/13/2016 1:30	50.4
3/13/2016 1:45	51
3/13/2016 3:00	47.4
3/13/2016 3:15	49.8
3/13/2016 3:30	51
3/13/2016 3:45	51
3/13/2016 4:00	48.6

Любая помощь приветствуется. Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Исключение, которое вы видите, связано с тем, что вы пытаетесь оценить серию с множеством разных записей в сравнении с набором отдельных условий.Вкратце, давайте посмотрим, что вы делаете:

Анализ ошибок (почему бы не сделать это так):

Сначала вы взяли пандстолбец 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

Дальнейшее чтение здесь , здесь , здесь и здесь.

0 голосов
/ 13 июня 2018

Как насчет использования & вместо and?

Для операторов or и и python требуются значения истинности.Мы делаем это, потому что в пандах они считаются неоднозначными, поэтому мы должны использовать побитовые операторы "|"(или) или операции «&» (и).

if (Month<3): InDayLightSavings=False
if (Month==3) & (Day<11) & (Hour<2): InDayLightSavings=False
if (Month>11): InDayLightSavings=False
if (Month==11) & (Day>4) & (Hour>=2): InDayLightSavings=False

(PS: я мог бы это прокомментировать, но у меня нет репутации, чтобы это делать.)

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