Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Вы можете напрямую обращаться к атрибутам year
и month
или запросить datetime.datetime
:
In [15]: t = pandas.tslib.Timestamp.now()
In [16]: t
Out[16]: Timestamp('2014-08-05 14:49:39.643701', tz=None)
In [17]: t.to_datetime()
Out[17]: datetime.datetime(2014, 8, 5, 14, 49, 39, 643701)
In [18]: t.day
Out[18]: 5
In [19]: t.month
Out[19]: 8
In [20]: t.year
Out[20]: 2014
. Один из способов комбинирования года и месяца - сделать целочисленную кодировку, такую как: 201408
за август 2014 года. По всему столбцу вы могли бы сделать это как:
df['YearMonth'] = df['ArrivalDate'].map(lambda x: 100*x.year + x.month)
или многие его варианты.
Я не большой поклонник однако, поскольку это делает выравнивание даты и арифметику болезненным позже и особенно болезненным для других, которые приходят на ваш код или данные без этого же соглашения. Лучше всего выбрать день-месяц, например, окончательный нерабочий день недели или первый день и т. Д., И оставить данные в формате даты и времени с выбранным соглашением о дате.
Модуль calendar
полезен для получения значения количества определенных дней, например, в последний день недели. Затем вы можете сделать что-то вроде:
import calendar
import datetime
df['AdjustedDateToEndOfMonth'] = df['ArrivalDate'].map(
lambda x: datetime.datetime(
x.year,
x.month,
max(calendar.monthcalendar(x.year, x.month)[-1][:5])
)
)
Если вам посчастливилось найти способ решить более простую проблему просто форматирования столбца datetime в некоторое строковое представление, для этого вы можете просто использовать функцию strftime
из класса datetime.datetime
, например:
In [5]: df
Out[5]:
date_time
0 2014-10-17 22:00:03
In [6]: df.date_time
Out[6]:
0 2014-10-17 22:00:03
Name: date_time, dtype: datetime64[ns]
In [7]: df.date_time.map(lambda x: x.strftime('%Y-%m-%d'))
Out[7]:
0 2014-10-17
Name: date_time, dtype: object
df['year_month']=df.datetime_column.apply(lambda x: str(x)[:7])
Это работало отлично для меня, не думал, что панды будут интерпретировать итоговую дату строки как дату, но когда я сделал сюжет, он очень хорошо знал мою повестку дня и строку year_month, где было заказано правильно ... gotta люблю панды!
Благодаря jaknap32 я хотел объединить результаты в соответствии с Годом и Месяцем, так что это сработало:
df_join['YearMonth'] = df_join['timestamp'].apply(lambda x:x.strftime('%Y%m'))
Выход был опрятным:
0 201108
1 201108
2 201108
Извлечение Года из ['2018-03-04']
df['Year'] = pd.DatetimeIndex(df['date']).year
df ['Year'] создает новый столбец. Хотя, если вы хотите извлечь месяц, просто используйте .month
Вы можете сначала преобразовать свои строки даты с помощью pandas.to_datetime , что дает вам доступ ко всем функциям даты и времени numpy и timedelta . Например:
df['ArrivalDate'] = pandas.to_datetime(df['ArrivalDate'])
df['Month'] = df['ArrivalDate'].values.astype('datetime64[M]')
Если вы хотите, чтобы новые столбцы показывали год и месяц отдельно, вы можете сделать это:
df['year'] = pd.DatetimeIndex(df['ArrivalDate']).year
df['month'] = pd.DatetimeIndex(df['ArrivalDate']).month
или ...
df['year'] = df['ArrivalDate'].dt.year
df['month'] = df['ArrivalDate'].dt.month
Затем вы можете комбинировать их или работать с они такие же, как и они.
timeit
показывают, что подход DatetimeIndex
значительно быстрее, чем .map/.apply
или .dt
.
– Snorfalorpagus
25 October 2016 в 09:34
df['date_column_trunc'] = df[date_column'].apply(lambda s: datetime.date(s.year, s.month, 1)
– Stewbaca
30 July 2018 в 20:59
Если вам нужна уникальная пара месяца месяца, использование приложения довольно гладкое.
df['mnth_yr'] = df['date_column'].apply(lambda x: x.strftime('%B-%Y'))
выводит месяц-год в одном столбце.
не забудьте сначала изменить формат до даты-времени до, я вообще забыл: |
df['date_column'] = pd.to_datetime(df['date_column'])
Лучший способ найти !!
date_column
должен быть в формате даты.
df['month_year'] = df.date_column.dt.to_period('M')
Вы также можете использовать D
для дня, 2M
в течение 2 месяцев и т. д. для разных интервалов выборки, и в случае, если у вас есть временные ряды с меткой времени, мы можем пойти на гранулированные интервалы выборки, такие как 45Min
в течение 45 минут, 15Min
для 15-минутного отбора проб и т. д.
datetime64
dtype. Используя df.my_date_column.astype('datetime64[M]')
, как в , ответ Хуана преобразуется в даты, представляющие первый день каждого месяца.
– Nickolay
26 May 2018 в 19:52
pandas
split-apply-comb. Мои предложения, приведенные выше, не должны рассматриваться как подтверждение того, что они являются наиболее эффективными подходами к вашему делу - просто они являются стилистически действительными вариантами Pythonic для целого ряда случаев. – ely 5 August 2014 в 20:03df['YearMonth'] = df['ArrivalDate'].map(lambda x: 1000*x.year + x.month)
. – Git Gud 23 June 2018 в 20:55