我在df
中有一系列从1930年1月1日开始到2020年5月7日结束的日子。我想要以不同方式划分年份的列:到目前为止,我有表示年份、月份和周的列。我还想要表示Dekad
和Semi-Month
增量的列。
Dekad是10天的时间段,其中1月1-10日是"Dekad";1〃;,1月11日至20日;2〃;,等等以及最后的dekad";37〃;将具有小于10的长度,这是因为365不被10均匀地分割。
对于semi-month
,我想将每个月减半,然后逐年递增。这有点棘手,因为月份有不同的长度,但基本上1月1日至15日将是"月";1〃;1月16日至31日将是";2〃;2月1日至14日将是";3〃;2月15日至28日将是";4〃;,等(在非闰年(
换句话说,我想要日历年的自定义日期时间分割或自定义期间。对于dekad来说,这应该相对容易做到,所以这是我的首要任务,而不是半个月的拆分。
datetime
包中是否有已经可以做到这一点的东西,或者我是否需要编写自定义函数?
如果是后者,Dekad
的起点可能是取first_day_of_year对象,然后将datetime.timedelta(days=10)
相加,并为每个dekad从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
比用MonthEnd
除以2得到的该月的最后一天大(gt
(的地方,将月数乘以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