如何解决如何在python中对日历年数据进行自定义时间半月和10天拆分?
从1930年1月1日到2020年5月7日,在df
中有几天。我想要以不同方式划分年份的列:到目前为止,我有表示Year,Month和Week的列。我还希望列分别表示Dekad
和Semi-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 举报,一经查实,本站将立刻删除。