微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在python中对日历年数据进行自定义时间半月和10天拆分?

如何解决如何在python中对日历年数据进行自定义时间半月和10天拆分?

从1930年1月1日到2020年5月7日,在df中有几天。我想要以不同方式划分年份的列:到目前为止,我有表示Year,Month和Week的列。我还希望列分别表示DekadSemi-Month的增量。

Dekad为10天,其中1月1-10日为dekad“ 1”,1月11-20日为dekad“ 2”,依此类推,最终的dekad“ 37”的长度小于10,因为365不除法均匀地按10。

对于semi-month,我想将每个月分成两半,然后逐年递增。这有点棘手,因为月份的长度不同,但是基本上1月1日至15日为“ 1”,1月16日至31日为“ 2”,2月1日至14日为“ 3”,2月15-28日为“ 4“等(在非leap年)。

换句话说,我想要自定义日期时间分割或日历年的自定义时间段。对于dekads来说,这应该相对容易些,因此,与半个月一次的拆分相比,这是我的首要任务。

datetime程序包中已经有可以执行此操作的东西了吗?还是需要编写自定义函数

如果是后者,Dekad的出发点是要获取first_day_of_year对象,然后添加datetime.timedelta(days=10)并为每个十进制从1增加到37?欢迎提出建议。

# import packages 
import pandas as pd
import datetime
from dateutil.relativedelta import *

# create dataframe with dates
df = pd.DataFrame()
df['Datetime'] = pd.date_range(start='1/1/1930',periods=33000,freq='D')

# extract the Year,Month,etc. from the Datetime 
df['Year'] = [dt.year for dt in df['Datetime']]
df['Month'] = [dt.month for dt in df['Datetime']]
df['Week'] = [dt.week for dt in df['Datetime']]

这是我最终想要的:

    Datetime    Year    Month   Week  Semi_Month  Dekad
0   1930-01-01  1930    1       1     1           1
1   1930-01-02  1930    1       1     1           1
2   1930-01-03  1930    1       1     1           1
3   1930-01-04  1930    1       1     1           1
4   1930-01-05  1930    1       1     1           1
... ... ... ... ...
32995   2020-05-03  2020    5   18    9           13
32996   2020-05-04  2020    5   19    9           13
32997   2020-05-05  2020    5   19    9           13
32998   2020-05-06  2020    5   19    9           13
32999   2020-05-07  2020    5   19    9           13

解决方法

对于Dekad,实际上是dayofyear整数除以10加1。对于Semi_month,该想法是检查月份的day大于(gt ),则要比用MonthEnd除以2所得的月份的最后一天加上月份数乘以2减去1。

df['Semi_Month'] = (df['Datetime'].dt.day
                      .gt((df['Datetime']+pd.tseries.offsets.MonthEnd()).dt.day//2) 
                      + df['Month']*2 -1)
df['Dekad'] = df['Datetime'].dt.dayofyear//10+1

print(df)
        Datetime  Year  Month  Week  Semi_Month  Dekad
0     1930-01-01  1930      1     1           1      1
1     1930-01-02  1930      1     1           1      1
2     1930-01-03  1930      1     1           1      1
3     1930-01-04  1930      1     1           1      1
4     1930-01-05  1930      1     1           1      1
...          ...   ...    ...   ...         ...    ...
32995 2020-05-03  2020      5    18           9     13
32996 2020-05-04  2020      5    19           9     13
32997 2020-05-05  2020      5    19           9     13
32998 2020-05-06  2020      5    19           9     13
32999 2020-05-07  2020      5    19           9     13

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。