Вы можете использовать pandas.to_datetime()
, как рекомендовано в документации для pandas.read_csv()
:
Если столбец или индекс содержит непроверяемая дата, весь столбец или индекс будут возвращены без изменений как тип данных объекта. Для нестандартного синтаксиса datetime используйте
pd.to_datetime
послеpd.read_csv
.Демо:
>>> D = {'date': '2013-6-4'} >>> df = pd.DataFrame(D, index=[0]) >>> df date 0 2013-6-4 >>> df.dtypes date object dtype: object >>> df['date'] = pd.to_datetime(df.date, format='%Y-%m-%d') >>> df date 0 2013-06-04 >>> df.dtypes date datetime64[ns] dtype: object
Да, класс B
наследует метод foo
. Но переменная x
в B
скрывает x
в A
; он не заменяет его.
Это проблема области. Метод foo
в A
видит только переменные, которые находятся в области видимости. Единственной переменной в области видимости является переменная экземпляра x
в A
.
Метод foo
наследуется, но не переопределяется, в B
. Если вы должны явно переопределить foo
с тем же самым точным кодом:
class B extends A
{
int x = 6;
@Override
void foo()
{
System.out.println(this.x);
}
}
Тогда переменная, которая была бы в области видимости при упоминании this.x
, была бы B
x
, и 6
будет напечатано. Хотя текст метода одинаков, ссылка отличается от области видимости.
Кстати, если вы действительно хотели сослаться на A
x
в классе B
, вы может использовать super.x
.
Когда вы вызываете
b.foo();
Он проверяет, отменяет ли B
метод foo()
, которого у него нет. Затем он выглядит на одном уровне до суперкласса A
и вызывает этот метод.
Затем вы вызывали версию A
foo()
, которая затем выводит
this.x
Теперь A
не может видеть версию B
x
.
Чтобы решить эту проблему, вы должны переопределить метод в B
class B extends A
{
int x = 6;
@Override
void foo()
{
System.out.println(this.x);
}
}
Теперь вызов
b.foo();
вызовет версию B
foo()
, и вы получите ожидаемый результат.
Поля не переопределяются в Java и подклассах с теми же именами полей, что и родительский класс, т. е. «только» поля родительского класса. Поэтому this.x
относится к x
, определенному в текущем классе: A
. В то время как результат: 5
.
Чтобы быть более точным: метод foo()
наследуется подклассом B
, но это не означает, что поведение унаследованного метода изменится в отношении полей экземпляров, на которые ссылаются, поскольку, поскольку указанные поля не являются overridable: выражение this.x
, которое ссылается на поле A.x
в методе foo()
, ссылается на A.x
.
Это то же самое, что и для двух предыдущих утверждений:
B b = new B();
System.out.println(b.x); // refers B.x -> 6
System.out.println(((A)b).x); // refers A.x -> 5
b.foo(); // refers under the hood A.x -> 5
Очень хороший ответ rgettman показывает, как вы можете преодолеть скрытие поля в подклассе. Альтернатива для преодоления скрытия основывается на создании поля экземпляра private
(который рекомендуется) и предоставления метода, который возвращает значение. Таким образом, вы получаете преимущество от переопределяющего механизма, и скрытие поля больше не является проблемой для клиентов классов:
class A
{
private int x = 5;
int getX(){
return x;
}
void foo()
{
System.out.println(this.getX());
}
}
class B extends A
{
private int x = 6;
int getX(){
return x;
}
}
Ну, это из-за статической привязки.
1) Статическая привязка в Java происходит во время компиляции, тогда как динамическое связывание происходит во время выполнения.
2) частные методы , конечные методы и статические методы и переменные используют статическое связывание и связаны с компилятором, в то время как виртуальные методы связаны во время выполнения на основе объекта времени выполнения.
3) Статическое связывание использует информацию типа (класс в Java) для привязки во время динамического привязка использует Object для разрешения привязки.
4) Перегруженные методы связаны с использованием статической привязки, тогда как переопределенные методы связаны с использованием динамического связывания во время выполнения.
blockquote>