Извлечь день, месяц и час из строки Timestamp в Python [дубликат]

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
108
задан monkeybiz7 5 August 2014 в 19:44
поделиться

9 ответов

Вы можете напрямую обращаться к атрибутам 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
83
ответ дан ely 18 August 2018 в 14:47
поделиться
  • 1
    Производительность может быть плохой, поэтому всегда полезно наилучшим образом использовать вспомогательные функции, векторизованные операции и методы pandas split-apply-comb. Мои предложения, приведенные выше, не должны рассматриваться как подтверждение того, что они являются наиболее эффективными подходами к вашему делу - просто они являются стилистически действительными вариантами Pythonic для целого ряда случаев. – ely 5 August 2014 в 20:03
  • 2
    Ответ, приведенный @KieranPC, намного быстрее – Ben 24 May 2016 в 20:56
  • 3
    лучший ответ явно. df ['mnth_yr'] = df.date_column.dt.to_period ('M'), как показано ниже: @ jaknap32 – ihightower 23 June 2017 в 06:16
  • 4
    Вы должны умножить на 100 в df['YearMonth'] = df['ArrivalDate'].map(lambda x: 1000*x.year + x.month). – Git Gud 23 June 2018 в 20:55
  • 5
    @GitGud Спасибо, что выбрали эту опечатку. Я обновил его с помощью исправления. – ely 26 June 2018 в 13:36
df['year_month']=df.datetime_column.apply(lambda x: str(x)[:7])

Это работало отлично для меня, не думал, что панды будут интерпретировать итоговую дату строки как дату, но когда я сделал сюжет, он очень хорошо знал мою повестку дня и строку year_month, где было заказано правильно ... gotta люблю панды!

1
ответ дан Chewpers 18 August 2018 в 14:47
поделиться

Благодаря jaknap32 я хотел объединить результаты в соответствии с Годом и Месяцем, так что это сработало:

df_join['YearMonth'] = df_join['timestamp'].apply(lambda x:x.strftime('%Y%m'))

Выход был опрятным:

0    201108
1    201108
2    201108
3
ответ дан Community 18 August 2018 в 14:47
поделиться

Извлечение Года из ['2018-03-04']

df['Year'] = pd.DatetimeIndex(df['date']).year  

df ['Year'] создает новый столбец. Хотя, если вы хотите извлечь месяц, просто используйте .month

3
ответ дан Douglas 18 August 2018 в 14:47
поделиться
  • 1
    Спасибо, Было очень полезно date_1 = pd.DatetimeIndex (df ['date']) --year = date_1.year # В течение лет - --month = date_1.month # В течение месяцев - --dy = date_1. день # В течение нескольких дней - – Edwin Torres 6 June 2018 в 16:46

Вы можете сначала преобразовать свои строки даты с помощью pandas.to_datetime , что дает вам доступ ко всем функциям даты и времени numpy и timedelta . Например:

df['ArrivalDate'] = pandas.to_datetime(df['ArrivalDate'])
df['Month'] = df['ArrivalDate'].values.astype('datetime64[M]')
2
ответ дан Juan A. Navarro 18 August 2018 в 14:47
поделиться

Если вы хотите, чтобы новые столбцы показывали год и месяц отдельно, вы можете сделать это:

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

Затем вы можете комбинировать их или работать с они такие же, как и они.

150
ответ дан KieranPC 18 August 2018 в 14:47
поделиться
  • 1
    Есть ли способ сделать это в одной строке? Я хочу, чтобы не переходить один и тот же столбец несколько раз. – fixxxer 1 November 2015 в 17:40
  • 2
    Некоторые быстрые бенчмаркинга с timeit показывают, что подход DatetimeIndex значительно быстрее, чем .map/.apply или .dt. – Snorfalorpagus 25 October 2016 в 09:34
  • 3
    лучший ответ явно. df ['mnth_yr'] = df.date_column.dt.to_period ('M'), как показано ниже: @ jaknap32 – ihightower 23 June 2017 в 06:16
  • 4
    что на самом деле делает pd.Datetimeindex? – JOHN 16 April 2018 в 05:24
  • 5
    Я иногда делаю это: 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'])
20
ответ дан MERose 18 August 2018 в 14:47
поделиться

Лучший способ найти !!

date_column должен быть в формате даты.

df['month_year'] = df.date_column.dt.to_period('M')

Вы также можете использовать D для дня, 2M в течение 2 месяцев и т. д. для разных интервалов выборки, и в случае, если у вас есть временные ряды с меткой времени, мы можем пойти на гранулированные интервалы выборки, такие как 45Min в течение 45 минут, 15Min для 15-минутного отбора проб и т. д.

90
ответ дан rollthedice32 18 August 2018 в 14:47
поделиться
  • 1
    Конечно, лучший ответ .. – ashishsingal 6 April 2018 в 15:21
  • 2
    Лучший ответ. OP можете ли вы считать, что это признанный ответ? – Johnyy 17 April 2018 в 03:43
  • 3
    Обратите внимание, что итоговый столбец больше не относится к datetime64 dtype. Используя df.my_date_column.astype('datetime64[M]'), как в , ответ Хуана преобразуется в даты, представляющие первый день каждого месяца. – Nickolay 26 May 2018 в 19:52
0
ответ дан jpp 30 October 2018 в 05:13
поделиться
Другие вопросы по тегам:

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