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

2024-09-25 08:28:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有从1930年1月1日开始到2020年5月7日结束的几天。我想要以不同方式划分年份的列:到目前为止,我有表示年份、月份和星期的列。我还需要表示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”,等等(在非闰年)

换句话说,我需要自定义日期时间分割或日历年的自定义时段。这对于dekads来说应该是相对容易的,所以这比半个月的分割更重要

datetime包中是否有已经可以执行此操作的东西,或者我是否需要编写自定义函数

如果是后者,那么Dekad的起点可能是取一年中的第一天对象,然后加上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

Tags: inimportdffordatetimedtyear增量
1条回答
网友
1楼 · 发布于 2024-09-25 08:28:31

对于Dekad,它实际上是^{}整数除以10加1。对于半个月,检查该月的day比用^{}除以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

相关问题 更多 >