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

时间:2014-08-05 18:44:30

标签: python pandas

我有一个Dataframe,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']

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

但我仍然喜欢重新配置整个列的方法。有什么想法吗?

12 个答案:

答案 0 :(得分:208)

如果您想要分别显示年份和月份的新列,则可以执行此操作:

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

然后你可以将它们组合起来或者像它们一样使用它们。

答案 1 :(得分:168)

找到最佳方式 !!

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

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

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

答案 2 :(得分:113)

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

答案 3 :(得分:25)

如果你想要月份独特的一对,使用apply非常流畅。

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

在一栏中输出月份。

不要忘记先将格式更改为日期时间,我一般都会忘记:|

    df['date_column'] = pd.to_datetime(df['date_column'])

答案 4 :(得分:9)

从[' 2018-03-04']

中提取年份
df['Year'] = pd.DatetimeIndex(df['date']).year  

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

答案 5 :(得分:8)

单行:添加带有“年-月”对的列: (“'pd.to_datetime'首先将列dtype更改为操作之前的日期时间)

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')


答案 6 :(得分:5)

感谢jaknap32,我想根据年份和月份汇总结果,所以这很有效:

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

输出很整洁:

0    201108
1    201108
2    201108

答案 7 :(得分:2)

您可以先使用pandas.to_datetime转换日期字符串,这样您就可以访问所有numpy datetime and timedelta工具。例如:

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

答案 8 :(得分:2)

@KieranPC's solution是适用于Pandas的正确方法,但对于任意属性而言并不容易扩展。为此,您可以在生成器理解中使用getattr并使用pd.concat进行组合:

DROP TABLE my_table;

CREATE TABLE my_table (i INT NOT NULL);

INSERT INTO my_table VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9);


 SELECT * 
   FROM
      ( SELECT i 
             , @x:=@x+1 x 
          FROM 
             ( SELECT i FROM my_table ORDER BY RAND())a, (SELECT @x:=0) vars
       ) n
   ORDER 
      BY i;
+---+------+
| i | x    |
+---+------+
| 1 |    7 |
| 2 |    2 |
| 3 |    4 |
| 4 |    9 |
| 5 |    3 |
| 6 |    8 |
| 7 |    1 |
| 8 |    6 |
| 9 |    5 |
+---+------+

答案 9 :(得分:1)

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

这对我来说很好,没想到大熊猫会把结果字符串日期解释为日期,但是当我做了这个情节时,它非常清楚我的日程安排和字符串year_month正确订购了...得爱大熊猫!

答案 10 :(得分:0)

不使用方法就可以为所有数据框提取年份。

第1步

将列转换为日期时间:

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

第二步

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

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

答案 11 :(得分:0)

<块引用>

然后我尝试了:

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

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

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