Эта проблема несколько обсуждается в списке ошибок 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
Вы можете проверить, как показано ниже, с помощью 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
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
blockquote> blockquote>