Невозможно создать новый столбец меток времени в пандах на основе условного w / np.where - PullRequest
0 голосов
/ 16 октября 2018

В процессе написания скрипта для автоматизации составления отчета я пытаюсь создать столбец меток времени на основе условного выражения с помощью np.where ().Логика следующая:

df['StartMonth'] = np.where(
    chng['Count'] == 1, pd.Timestamp(
        int(year), chng['Month'].astype(int), 1), str('')
    )

DataFrame - это список сотрудников, которые считаются добавлениями или удалениями, где chng['Count'] используется в качестве флага, который показывает +1 как добавление и -1как удаление.Поэтому, когда добавляется любой сотрудник, создайте серию StartMonth, в которой фиксированная переменная year, Month строки и 1 используются в качестве основы для создания метки времени (year и chng).['Месяц'] являются строками, поэтому приводим их как условные целые числа).Вывод функции выглядит следующим образом для каждой строки True:

   Month  Count                              StartMonth
0      1      1  1970-01-01 00-00-01.000002+00019:00:01
1      1      1  1970-01-01 00-00-01.000002+00019:00:01
2      4      1  1970-01-01 00-00-01.000002+00019:00:01
3      5      1  1970-01-01 00-00-01.000002+00019:00:01
4     10      1  1970-01-01 00-00-01.000002+00019:00:01

Я пробовал это с year и chng ['Month'] уже приведен как целые числа до условногои это был тот же результат.Единственный раз, когда он «работает», это когда chng ['Month'] заменяется любым другим произвольным числом, что наводит меня на мысль, что это проблема.Я выполнил множество других условных выражений с помощью np.where (), которые используют значения из другой серии в DataFrame (хотя и не в качестве основы для создания метки времени) без каких-либо проблем, поэтому я не уверен, что является причиной этого.

1 Ответ

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

Есть несколько проблем:

  1. Вы должны использовать pd.to_datetime для векторизации преобразования, а не pd.Timestamp.
  2. numpy.where возвратамассив NumPy, который отличается от серии Pandas datetime.Но вы можете передать массив в pd.to_datetime.
  3. . Следует избегать объединения строк со значениями datetime в одной серии.Выбери один.Здесь вместо '' используйте pd.NaT, чтобы убедиться, что ваша серия остается datetime.

Вот пример решения:

year = 2018
s = str(year) + '-' + df['Month'].astype(str)

df['StartMonth'] = pd.to_datetime(np.where(df['Count'] == 1, s, pd.NaT))

print(df)

   Month  Count StartMonth
0      1      1 2018-01-01
1      1      1 2018-01-01
2      4      1 2018-04-01
3      5      1 2018-05-01
4     10      1 2018-10-01
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...