Панды - проверьте, есть ли в каком-либо столбце дата-время, и измените его на строку формата даты (гггг-мм-дд)

Эта проблема несколько обсуждается в списке ошибок Python3 . В конечном счете, чтобы получить это поведение, вам нужно сделать:

def foo():
    ldict = {}
    exec("a=3",globals(),ldict)
    a = ldict['a']
    print(a)

И если вы проверите документацию Python3 на exec , вы увидите следующее примечание:

Локали по умолчанию действуют, как описано для функции locals() ниже: не следует пытаться модифицировать словарь локальных файлов по умолчанию. Передайте явный словарь locals, если вам нужно увидеть эффекты кода на локалях после возврата функции exec ().

Обратившись к к определенному сообщению в отчете об ошибке , Георг Брандл говорит:

Для изменения локалей функции «на лету» невозможно без нескольких последствий: обычно локаторы функций не хранятся в словаре, а массиве, индексы которого определяются во время компиляции из известных локалей. Это сталкивается, по крайней мере, с новыми локалями, добавленными exec. Старая инструкция exec обошла это, потому что компилятор знал, что если в функции произошел exec без globals / locals args, это пространство имен будет «неоптимизировано», то есть не будет использовать массив locals. Поскольку exec () теперь является нормальной функцией, компилятор не знает, к чему «exec» может быть привязан, и поэтому не может быть обработан специально.

Акцент мой.

Таким образом, суть в том, что Python3 может лучше оптимизировать использование локальных переменных с помощью not , позволяя это поведение по умолчанию.

И ради полноты, как упомянутый в комментариях выше, этот работает , как и ожидалось в Python 2.X:

Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) 
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def f():
...     a = 1
...     exec "a=3"
...     print a
... 
>>> f()
3

1
задан Sid29 18 January 2019 в 03:07
поделиться

2 ответа

Вы можете проверить, как показано ниже, с помощью df.dtypes:

>>> df
   PERSON ID MOVING DATE           PLACE
0          1  2018-01-01        New York
1          1  2018-01-20  Rio de Janeiro
2          1  2018-02-13          London
3          2  2017-06-12          Seatle
4          2  2016-10-10      New Mexico
5          3  2017-09-19       Sao Paulo
6          3  2015-12-11      Bangladesh


>>> df.dtypes
PERSON ID               int64
MOVING DATE    datetime64[ns]
PLACE                  object
dtype: object

Или, в частности, если вы хотите увидеть, какие столбцы являются датой и временем, используйте numpy следующим образом. ТАК, NumPy дает вам подробный процесс отбора ..

>>> df.select_dtypes(include=[np.datetime64])
  MOVING DATE
0  2018-01-01
1  2018-01-20
2  2018-02-13
3  2017-06-12
4  2016-10-10
5  2017-09-19
6  2015-12-11

Вы можете сделать то же самое, чтобы определить, есть ли столбцы с номерами

>>> df.select_dtypes(include=[np.number])
   PERSON ID
0          1
1          1
2          1
3          2
4          2
5          3
6          3

, чтобы определить, имеют ли столбцы тип объекта:

>>> df.select_dtypes(include=[np.object])
            PLACE
0        New York
1  Rio de Janeiro
2          London
3          Seatle
4      New Mexico
5       Sao Paulo
6      Bangladesh
0
ответ дан pygo 18 January 2019 в 03:07
поделиться
df = pd.DataFrame(data={'date':(['2018-12-08 00:00:00','2018-12-08 00:10:00','2018-12-08 01:10:00']),'B':[5,4,3],'C':[4,3,2]})

>>df

    date                B   C
0   2018-12-08 00:00:00 5   4
1   2018-12-08 00:10:00 4   3
2   2018-12-08 01:10:00 3   2

>>df.dtypes

date     object
B        int64
C        int64

>>df[df.select_dtypes(['object']).columns]=df[df.select_dtypes(['object']).columns].apply(pd.to_datetime)

Опубликовать это вы можете вызвать dt.date для ряда, например:

>>df['date'].dt.date
0    2018-12-08
1    2018-12-08
2    2018-12-08

Или для выбора нескольких столбцов (Обратите внимание, что выше может произойти сбой, если у вас есть какие-либо другие столбцы объекта, не напоминающие date, в этом случае используйте как показано ниже)

df[['col1','col2']] = df[['col1','col2']].apply(pd.to_datetime)

Из документов: unuder select_dtypes

Чтобы выбрать datetime, используйте np.datetime64, 'datetime' или 'datetime64' Чтобы выбрать timedeltas, используйте np.timedelta64, 'timedelta' или 'timedelta64

0
ответ дан anky_91 18 January 2019 в 03:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: