我在這里嘗試了幾種方法,但似乎無法做到正確。我想要做的是查看一個日期時間戳列,并創建一個具有該周周日開始的新列。
它大多數情況下都有效,除非日期時間戳是在星期日,否則它不會將該星期日作為一周的開始,而是指回上一個星期日。
樣本資料集:
import pandas as pd
data = [
['0', '2022-05-22 00:25:13'],
['1', '2022-05-25 14:59:50'],
['2', '2022-05-28 17:32:37'],
['3', '2022-08-15 11:07:52'],
['4', '2022-04-08 16:52:39']]
columns = ['id', 'event_timestamp_et']
df = pd.DataFrame(data, columns=columns)
df['event_timestamp_et'] = pd.to_datetime(df['event_timestamp_et'])
預期輸出:
id event_timestamp_et startWeek
0 0 2022-05-22 00:25:13 2022-05-22
1 1 2022-05-25 14:59:50 2022-05-22
2 2 2022-05-28 17:32:37 2022-05-22
3 3 2022-08-15 11:07:52 2022-08-14
4 4 2022-04-08 16:52:39 2022-04-03
如您所見,這是我嘗試過的(我已經包含了一些方法),但效果不佳:
df['startWeek'] = df['event_timestamp_et'] - pd.offsets.Week(weekday=6)
df['startWeek'] = df['startWeek'].dt.normalize()
df['startWeek1'] = df['event_timestamp_et'] - pd.to_timedelta(df['event_timestamp_et'].dt.dayofweek, unit='d')
df['startWeek2'] = df['event_timestamp_et'].dt.to_period('W-SUN').apply(lambda r: r.start_time)
df["startWeek3"] = df['event_timestamp_et'].dt.to_period('W').dt.start_time pd.Timedelta(6, unit='d')
實際輸出:
id event_timestamp_et startWeek startWeek1 startWeek2 startWeek3
0 0 2022-05-22 00:25:13 2022-05-15 2022-05-16 00:25:13 2022-05-16 2022-05-22
1 1 2022-05-25 14:59:50 2022-05-22 2022-05-23 14:59:50 2022-05-23 2022-05-29
2 2 2022-05-28 17:32:37 2022-05-22 2022-05-23 17:32:37 2022-05-23 2022-05-29
3 3 2022-08-15 11:07:52 2022-08-14 2022-08-15 11:07:52 2022-08-15 2022-08-21
4 4 2022-04-08 16:52:39 2022-04-03 2022-04-04 16:52:39 2022-04-04 2022-04-10
uj5u.com熱心網友回復:
一種使用W-SATnot的方法W-SUN(與Wbtw 相同)
df["event_timestamp_et"].dt.to_period("W-SAT").dt.start_time
輸出:
0 2022-05-22
1 2022-05-22
2 2022-05-22
3 2022-08-14
4 2022-04-03
Name: event_timestamp_et, dtype: datetime64[ns]
驗證:
s = pd.Series(["2022-05-21 00:25:13",
"2022-05-22 00:25:13",
"2022-05-23 00:25:13",
"2022-05-24 00:25:13",
"2022-05-25 00:25:13",
"2022-05-26 00:25:13",
"2022-05-27 00:25:13",
"2022-05-28 00:25:13",
"2022-05-29 00:25:13",
"2022-05-30 00:25:13",])
df = pd.to_datetime(s).to_frame("date")
df["name"] = df["date"].dt.day_name()
df["start"] = df["date"].dt.to_period("W-SAT").dt.start_time
df["start_day"] = df["start"].dt.day_name()
輸出:
date name start start_day
0 2022-05-21 00:25:13 Saturday 2022-05-15 Sunday
1 2022-05-22 00:25:13 Sunday 2022-05-22 Sunday
2 2022-05-23 00:25:13 Monday 2022-05-22 Sunday
3 2022-05-24 00:25:13 Tuesday 2022-05-22 Sunday
4 2022-05-25 00:25:13 Wednesday 2022-05-22 Sunday
5 2022-05-26 00:25:13 Thursday 2022-05-22 Sunday
6 2022-05-27 00:25:13 Friday 2022-05-22 Sunday
7 2022-05-28 00:25:13 Saturday 2022-05-22 Sunday
8 2022-05-29 00:25:13 Sunday 2022-05-29 Sunday
9 2022-05-30 00:25:13 Monday 2022-05-29 Sunday
uj5u.com熱心網友回復:
一個解決方案pandas.tseries.offsets.Week:
col_date = df['event_timestamp_et']
#Is the date concides with the start of the week (Sunday) ?
mask = col_date.ne(col_date - pd.offsets.Week(weekday=6) pd.offsets.Week())
df['startWeek'] = col_date.mask(mask, col_date - pd.offsets.Week(weekday=6)).dt.date
# 輸出 :
print(df)
id event_timestamp_et startWeek
0 0 2022-05-22 00:25:13 2022-05-22
1 1 2022-05-25 14:59:50 2022-05-22
2 2 2022-05-28 17:32:37 2022-05-22
3 3 2022-08-15 11:07:52 2022-08-14
4 4 2022-04-08 16:52:39 2022-04-03
uj5u.com熱心網友回復:
您可以轉換為以周六結束的每周周期:
df['event_timestamp_et'].dt.to_period('W-SAT').dt.start_time
輸出:
0 2022-05-22
1 2022-05-22
2 2022-05-22
3 2022-08-14
4 2022-04-03
Name: event_timestamp_et, dtype: datetime64[ns]
uj5u.com熱心網友回復:
我嘗試過的一種方法是使用 numpy 來查找“星期日”。如果是“星期日”,則使用該日期,否則,獲取上一個星期日。有沒有更好的方法?
import pandas as pd
import numpy as np
data = [
['0', '2022-05-22 00:25:13'],
['1', '2022-05-25 14:59:50'],
['2', '2022-05-28 17:32:37'],
['3', '2022-08-15 11:07:52'],
['4', '2022-04-08 16:52:39']]
columns = ['id', 'event_timestamp_et']
df = pd.DataFrame(data, columns=columns)
df['event_timestamp_et'] = pd.to_datetime(df['event_timestamp_et'])
df['startWeek'] = np.where(df['event_timestamp_et'].dt.day_name() == 'Sunday', df['event_timestamp_et'].dt.normalize(), df['event_timestamp_et'] - pd.offsets.Week(weekday=6))
df['startWeek'] = pd.to_datetime(df['startWeek'])
df['startWeek'] = df['startWeek'].dt.normalize()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/512109.html
標籤:熊猫约会时间日期时间偏移
