如何在Pandas Dataframe中将非星期一列转换为星期一

nzkunb0c  于 2023-06-28  发布在  其他
关注(0)|答案(2)|浏览(134)

我想写一个函数,如果日期是Tue. Wed. Tur。如果日期是星期五,则将其转换为本周的星期一。星期六。星期天。然后把它转换成下星期一。如果是星期一,就这样离开吧。
示例输入Dataframe如下所示:
| 型号|订单类别|2022年4月18日|2022年5月10日|2022年5月18日|2022年5月26日|2022年6月24日|2022年7月16日|2022年7月24日|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 一个|打开|0| 0| 0| 0|一个|一个|2|
| B|关闭|一个|一个|0| 0|一个|2| 2|
| C类|打开|0| 0|一个|一个|0|一个|2|
理想的输出是这样的:
所有的日期标题都根据我指定的规则转换为星期一。
| 型号|订单类别|2022年4月18日|2022年5月9日|2022年5月16日|2022年5月23日|2022年6月27日|2022年7月18日|2022年7月25日|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 一个|打开|0| 0| 0| 0|一个|一个|2|
| B|关闭|一个|一个|0| 0|一个|2| 2|
| C类|打开|0| 0|一个|一个|0|一个|2|
真的很感谢你的帮助!

nwwlzxa7

nwwlzxa71#

您可以用途:

import numpy as np

# Convert as datetime and extract day of week
dates = pd.to_datetime(df.columns[2:])
dow = dates.day_of_week

# Create timedelta Mon, Thu, Wed, Thu are negative, Fri, Sat, Sun are positive
offsets = pd.to_timedelta(np.where(dow < 4, -dow, 7-dow), unit='D')

# Adjust the dates then reindex your columns
dates = (dates + offsets).strftime('%Y/%-m/%-d')
df.columns = df.columns[:2].append(dates)

输出:
| 型号|订单类别|2022年4月18日|2022年5月9日|2022年5月16日|2022年5月23日|2022年6月27日|2022年7月18日|2022年7月25日|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 一个|打开|0| 0| 0| 0|一个|一个|2|
| B|关闭|一个|一个|0| 0|一个|2| 2|
| C类|打开|0| 0|一个|一个|0|一个|2|
中间体:
| 之前|偏移量|之后|
| - -----|- -----|- -----|
| 2022-04-18 2022-04-18 2022-04-18| 0天|2022-04-18 2022-04-18 2022-04-18|
| 2022-05-10 2022-05-10 2022-05-10|-1天|2022-05-09 2022-05-09|
| 2022-05-18 2022-05-18 2022-05-18|-2天|2022-05-16 2022-05-16 2022-05-16|
| 2022-05-26 2022-05-26|-3天|2022-05-23|
| 2022-06-24 2022-06-24| 3天|2022-06-27 2022-06-27|
| 2022-07-16 2022-07-16| 2天|2022-07-18 2022-07-18 2022-07-18|
| 2022-07-24 2022-07-24| 1天|2022-07-25 2022-07-25|

laawzig2

laawzig22#

示例

import pandas as pd
data1 = {'Model#': {0: 'A', 1: 'B', 2: 'C'},
 'Order Category': {0: 'Open', 1: 'Close', 2: 'Open'},
 '2022/4/18': {0: 0, 1: 1, 2: 0},
 '2022/5/10': {0: 0, 1: 1, 2: 0},
 '2022/5/18': {0: 0, 1: 0, 2: 1},
 '2022/5/26': {0: 0, 1: 0, 2: 1},
 '2022/6/24': {0: 1, 1: 1, 2: 0},
 '2022/7/16': {0: 1, 1: 2, 2: 1},
 '2022/7/24': {0: 2, 1: 2, 2: 2}}
df1 = pd.DataFrame(data1)

步骤1

通过将date部分更改为monday,仅为date部分创建数据

idx = pd.to_datetime(df1.columns[2:], errors='coerce').to_period('W').to_timestamp()

IDX

DatetimeIndex(['2022-04-18', '2022-05-09', '2022-05-16', '2022-05-23',
               '2022-06-20', '2022-07-11', '2022-07-18'],
              dtype='datetime64[ns]', freq=None)

第二步

制作星期一索引

(df1
 .set_index(['Model#', 'Order Category'])
 .set_axis(idx.astype('str'), axis=1)
 .reset_index())

输出:

Model#  Order Category  2022-04-18  2022-05-09  2022-05-16  2022-05-23  2022-06-20  2022-07-11  2022-07-18
0   A   Open            0           0           0           0           1           1           2
1   B   Close           1           1           0           0           1           2           2
2   C   Open            0           0           1           1           0           1           2

相关问题