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

2024-03-19 04:56:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

但我仍然希望有一个方法来重新配置整个列。有什么想法吗?


Tags: 数据方法元素onlypandasdf错误mean
3条回答

如果希望新列分别显示年份和月份,可以执行以下操作:

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

然后你就可以把它们结合起来,或者像现在这样和它们一起工作。

您可以直接访问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

将年和月结合起来的一种方法是生成一个整数来编码它们,例如:2014年8月的201408。在整个专栏中,您可以这样做:

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类中的^{}函数,如下所示:

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['date_column']必须采用日期时间格式。

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

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

相关问题 更多 >