将熊猫ISO周号转换为常规周号

时间:2019-03-29 09:37:58

标签: python pandas date

我有一个降低采样的Open / High / Low / Last / Change / Volume值的数据框,用于十年以上的证券。 我试图获取每周的样本计数,即我的下采样方法(在本例中为音量条)中有多少个样本每周在整个数据集中采样,以便我可以将其绘制出来并与其他下采样方法进行比较。

到目前为止,我已经尝试按照herehere给出的答案在DF中创建一个名为“ Year-Week”的系列。 这些答案的问题在于,由于this答案中所述的ISO日历系统,我的EOY日期(例如“ 1997-12-30”)被转换为“ 1997-01”,当我应用value_counts方法。

我的代码如下:

volumeBar['Year/Week'] = (pd.Series(volumeBar.index).dt.year.astype(str) + "/" + pd.Series(volumeBar.index).dt.week.astype(str)).values

所以我的问题是:就目前而言,以下示例DateTimeIndex

Date
1997-12-22
1997-12-29
1997-12-30

成为

Year/Week
1997/52
1997/1
1997/1

如何获得以下预期结果?

Year/Week
1997/52
1997/52
1997/52

请记住,由于数据集的大小以及由于ISO日历的工作方式而导致的这些显示结果的易变性,我无法手动更正此行为。

非常感谢!

1 个答案:

答案 0 :(得分:0)

您可以使用下面的函数get_years_week来获取年和周而不使用ISO格式。

import pandas as pd
import datetime

a = {'Date': ['1997-11-29', '1997-12-22',
'1997-12-29',
'1997-12-30']}

data  = pd.DataFrame(a)

data['Date'] = pd.to_datetime(data['Date'])

# Function for getting weeks and years
def get_years_week(data):

     # Get year from date
     data['year'] = data['Date'].dt.year

     # loop over each row of date column and get week number
     for i in range(len(data)):
         data['week'] = (((data['Date'][i] - datetime.datetime\
                          (data['Date'][i].year,1,1)).days // 7) + 1)

     # create column for week and year
     data['year/week'] = pd.Series(data_2['year'].astype('str'))\
                         + '/' + pd.Series(data_2['week'].astype('str'))  
     return data