从Pandas Datetime列中分别提取月份和年份

我有一个数据框架,df,有以下列:

df['ArrivalDate'] =
...
936   2012-12-31
938   2012-12-29
965   2012-12-31
966   2012-12-31
967   2012-12-31
968   2012-12-31
969   2012-12-31
970   2012-12-29
971   2012-12-31
972   2012-12-29
973   2012-12-29
...

列的元素是pandas. tslip . timestamp。

我想只包括年份和月份。我以为会有简单的方法,但我想不出来。

以下是我的尝试:

df['ArrivalDate'].resample('M', how = 'mean')

我得到了以下错误:

Only valid with DatetimeIndex or PeriodIndex

然后我试着:

df['ArrivalDate'].apply(lambda(x):x[:-2])

我得到了以下错误:

'Timestamp' object has no attribute '__getitem__'

有什么建议吗?

编辑:我有点明白了。

df.index = df['ArrivalDate']

然后,我可以使用索引重新采样另一列。

但是我仍然想要一个重新配置整个列的方法。什么好主意吗?

994273 次浏览

你可以直接访问yearmonth属性,或者请求一个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_pydatetime() #datetime method is deprecated
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 for August, 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列格式化为一些字符串化的表示,为此你可以使用datetime.datetime类中的strftime函数,如下所示:

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'] = pd.DatetimeIndex(df['ArrivalDate']).year
df['month'] = pd.DatetimeIndex(df['ArrivalDate']).month

还是……

df['year'] = df['ArrivalDate'].dt.year
df['month'] = df['ArrivalDate'].dt.month

然后你就可以把它们组合起来,或者直接使用它们。

假如你想要月年独一无二的一对,使用套用是相当时髦的。

df['mnth_yr'] = df['date_column'].apply(lambda x: x.strftime('%B-%Y'))

在一列中输出月-年。

别忘了先把格式改成日期-时间之前,我一般都忘了。

df['date_column'] = pd.to_datetime(df['date_column'])
df['year_month']=df.datetime_column.apply(lambda x: str(x)[:7])

这对我来说工作得很好,不认为熊猫会将结果字符串日期解释为日期,但当我做图时,它非常清楚我的议程和字符串year_month的顺序…一定要爱熊猫!

你可以先用pandas.to_datetime转换你的日期字符串,这让你可以访问所有的Numpy datetime和timedelta工具。例如:

df['ArrivalDate'] = pandas.to_datetime(df['ArrivalDate'])
df['Month'] = df['ArrivalDate'].values.astype('datetime64[M]')

多亏了jaknap32,我想根据年和月聚合结果,所以这是可行的:

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

输出很简洁:

0    201108
1    201108
2    201108

df['date_column']必须是日期时间格式。

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

你也可以使用D代表天,2M代表2个月等不同的采样间隔,如果一个人有时间戳的时间序列数据,我们可以进行颗粒采样间隔,如45Min为45分钟,15Min为15分钟采样等。

提取年份say from ['2018-03-04']

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

df['Year']创建一个新列。而如果你想提取月份,只需使用.month

@KieranPC的解决方案是Pandas的正确方法,但不容易扩展到任意属性。为此,你可以在生成器理解中使用getattr,并使用pd.concat组合:

# input data
list_of_dates = ['2012-12-31', '2012-12-29', '2012-12-30']
df = pd.DataFrame({'ArrivalDate': pd.to_datetime(list_of_dates)})


# define list of attributes required
L = ['year', 'month', 'day', 'dayofweek', 'dayofyear', 'weekofyear', 'quarter']


# define generator expression of series, one for each attribute
date_gen = (getattr(df['ArrivalDate'].dt, i).rename(i) for i in L)


# concatenate results and join to original dataframe
df = df.join(pd.concat(date_gen, axis=1))


print(df)


ArrivalDate  year  month  day  dayofweek  dayofyear  weekofyear  quarter
0  2012-12-31  2012     12   31          0        366           1        4
1  2012-12-29  2012     12   29          5        364          52        4
2  2012-12-30  2012     12   30          6        365          52        4

在不使用apply方法的情况下,有两个步骤来提取所有数据帧的年份。

Step1

将列转换为datetime:

df['ArrivalDate']=pd.to_datetime(df['ArrivalDate'], format='%Y-%m-%d')

步骤2

使用DatetimeIndex()方法提取年份或月份

 pd.DatetimeIndex(df['ArrivalDate']).year

SINGLE LINE:添加一个带有'年-月'-对的列: (“pd。To_datetime '在操作前首先将列dtype更改为date-time)

df['yyyy-mm'] = pd.to_datetime(df['ArrivalDate']).dt.strftime('%Y-%m')

因此,对于额外的“年”或“月”列:

df['yyyy'] = pd.to_datetime(df['ArrivalDate']).dt.strftime('%Y')
df['mm'] = pd.to_datetime(df['ArrivalDate']).dt.strftime('%m')

然后我试着:

df['ArrivalDate'].apply(lambda(x):x[:-2])

我认为这里正确的输入应该是字符串。

df['ArrivalDate'].astype(str).apply(lambda(x):x[:-2])