我有如下代碼。我的問題:
- 為什么將第 1 周分配給
2014-12-29and'2014-1-1'?為什么不將第 53 周分配給2014-12-29? - 我如何分配不斷增加的周數?我想要
'2014-12-29','2015-1-1'第 53 周和'2015-1-15'第 55 周等。
x=pd.DataFrame(data=['2014-1-1','2014-12-29','2015-1-1','2015-1-15'],columns=['date'])

x['week_number']=pd.DatetimeIndex(x['date']).week

uj5u.com熱心網友回復:
至于為什么 2014 年 12 月 29 日的周數是 1 - 請參閱我在評論中鏈接的問題。對于您問題的第二部分:
2014 年 1 月 1 日是星期三。我們可以取您日期列的最小日期,獲取日期數并從差值中減去:
解決方案
# x["date"] = pd.to_datetime(x["date"]) # if not already a datetime column
min_date = x["date"].min() 1 # 1 because they're zero-indexed
x["weeks_from_start"] = ((x["date"].diff().dt.days.cumsum() - min_date) // 7 1).fillna(1).astype(int)
輸出:
date weeks_from_start
0 2014-01-01 1
1 2014-12-29 52
2 2015-01-01 52
3 2015-01-15 54
一步步
第一步是將date列轉換為日期時間型別,如果您還沒有:
In [3]: x.dtypes
Out[3]:
date object
dtype: object
In [4]: x["date"] = pd.to_datetime(x["date"])
In [5]: x
Out[5]:
date
0 2014-01-01
1 2014-12-29
2 2015-01-01
3 2015-01-15
In [6]: x.dtypes
Out[6]:
date datetime64[ns]
dtype: object
接下來,我們需要找到您的日期列的最小值并將其設定為周數的開始日期(添加 1,因為日期數從 0 開始):
In [7]: x["date"].min().day 1
Out[7]: 2
接下來,使用內置.diff()函式獲取相鄰行的差異:
In [8]: x["date"].diff()
Out[8]:
0 NaT
1 362 days
2 3 days
3 14 days
Name: date, dtype: timedelta64[ns]
請注意,我們得到NaT("not a time") 的第一個條目——那是因為第一行與它上面沒有什么可比較的。
解釋這些值的方法是,第 1 行是第 0 行之后的 362 天,第 2 行是第 1 行之后的 3 天,依此類推。
如果你取累計和減去起始天數,你會得到自起始日期以來的天數,在這種情況下2014-01-01,就好像星期三是第一周的第 0 天(這是因為當我們計算周數時從那個開始日期開始,我們需要補償星期三是那一周的中間這一事實):
In [9]: x["date"].diff().dt.days.cumsum() - min_date
Out[9]:
0 NaN
1 360.0
2 363.0
3 377.0
Name: date, dtype: float64
現在,當我們將地板除以 7 時,我們將得到自開始日期以來的正確周數:
In [10]: (x["date"].diff().dt.days.cumsum() - 2) // 7 1
Out[10]:
0 NaN
1 52.0
2 52.0
3 54.0
Name: date, dtype: float64
請注意,我們添加 1 是因為(我假設)您從 1 開始計數 - 即,2014-01-01您是第 1 周,而不是第 0 周。
最后, the.fillna只是為了解決這個問題(當我們開始做算術時,NaT它變成了 a )。NaN你用s.fillna(value)填充:NaNvalue
In [11]: ((x["date"].diff().dt.days.cumsum() - 2) // 7 1).fillna(1)
Out[11]:
0 1.0
1 52.0
2 52.0
3 54.0
Name: date, dtype: float64
最后用于.astype()將列轉換為整數而不是浮點數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/465421.html
