我有一个数据框架,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']

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

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


当前回答

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

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

对于不同的采样间隔,您也可以使用D表示日,2M表示2个月等,如果有带时间戳的时间序列数据,我们可以采用粒度采样间隔,例如45Min表示45分钟,15Min表示15分钟采样等。

其他回答

@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

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

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

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

单行:添加带有“年-月”对的列: (“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')

您可以先用熊猫转换日期字符串。To_datetime,它允许您访问所有numpy datetime和timedelta工具。例如:

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

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

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

对于不同的采样间隔,您也可以使用D表示日,2M表示2个月等,如果有带时间戳的时间序列数据,我们可以采用粒度采样间隔,例如45Min表示45分钟,15Min表示15分钟采样等。