如何从 python 中的时间序列中获取年月和季度

How to get Year Mont and Quarter from time series in python

我有这个数据集:

date_time srch_id
2013-04-04 08:32:15 1
2013-04-04 08:32:15 1
..
2013-06-30 19:55:18 332785
2013-06-30 19:55:18 332785

我想把date_time分成:YM(Year_Month),YMQ(Year_Month_Quarter),Y和M:

date_time srch_id YMQ YM Y M
2013-04-04 08:32:15 1 2013-04-2 2013-04 2013 4
2013-04-04 08:32:15 1 2013-04-2 2013-04 2013 4
..
2013-06-30 19:55:18 332785 2013-06-2 2013-04 2013 6
2013-06-30 19:55:18 332785 2013-06-2 2013-04 2013 6

我已经成功地将它与 YM、Y 和 M 分开,代码如下:

list_YM = [i.split(" ")[0][:-3] for i in  list(train_dataset['date_time'])]
list_Year = [i.split(" ")[0][0:4] for i in  list(train_dataset['date_time'])]
list_Month = [i.split(" ")[0][5:7] for i in  list(train_dataset['date_time'])]

train_dataset['YM'] = list_YM
train_dataset['Year'] = list_Year
train_dataset['Month'] = list_Month

但是如何获得YMQ和Q呢?

如果你已经有了list_Month中列出的月份,那么你可以使用简单的底整数除法得到每个月对应的季度:

list_quarter = [(((i - 1) // 3) + 1) for i in list_Month]

这是可行的,因为对于第 1、2 和 3 个月,此整数除法的结果将为零;第 4、5 和 6 个月 1 次;第 7、8 和 9 个月为 2;第 10、11 和 12 个月为 3。

对于 YMQ,您只需连接已有的 Y、M 和 Q。

如果您使用 pandas 包和 datetime 方法,则不需要使用 for-loops:

import pandas as pd

data = {'date_time': ['2013-04-04 08:32:15','2013-04-04 08:32:15','2013-06-30 19:55:18','2013-06-30 19:55:18'],
        'srch_id': [1,1,332785,332785]}
example = pd.DataFrame(data)

# Convert to datetime to use its methods
example['date_time'] = pd.to_datetime(example['date_time'])

# Add year as string
example['Y'] = example['date_time'].dt.year.astype(str)
# Add month as string
example['M'] = example['date_time'].dt.month.astype(str)

# Add year and month as string
example['YM'] = example['Y'] + '-' + example['M']

# Add year and quarter as string
example['YQ'] = example['date_time'].dt.to_period('Q').astype(str)

# Add year, month and quarter? Every month is already related to a quarter
example['YMQ'] = example['Y'] + '-' + example['M'] + '-' + example['YQ'].str.slice(-2)

# If you want date_Time column as string type:
example['date_time'] = example['date_time'].astype(str)

输出:

Out[53]: 
             date_time  srch_id     Y  M      YM      YQ        YMQ
0  2013-04-04 08:32:15        1  2013  4  2013-4  2013Q2  2013-4-Q2
1  2013-04-04 08:32:15        1  2013  4  2013-4  2013Q2  2013-4-Q2
2  2013-06-30 19:55:18   332785  2013  6  2013-6  2013Q2  2013-6-Q2
3  2013-06-30 19:55:18   332785  2013  6  2013-6  2013Q2  2013-6-Q2