将yyyyWn格式转换为yyyyww-Python

将yyyyWn格式转换为yyyyww-Python,python,pandas,dataframe,datetime,Python,Pandas,Dataframe,Datetime,我有一个dataframe,其数据格式如下: ID Date Volume 1 2019W1 9 1 2020W2 11 2 2019W1 39 2 2020W2 23 我想将其转换为yyyyww格式 df['Date'] = df['Date'].dt.strftime(%Y%U) 这段代码不太管用 错误消息: ValueError: ('Unknown string format: '2019W1') 预期产出

我有一个dataframe,其数据格式如下:

ID    Date     Volume 
1    2019W1      9
1    2020W2     11
2    2019W1     39
2    2020W2     23
我想将其转换为yyyyww格式

df['Date'] = df['Date'].dt.strftime(%Y%U)
这段代码不太管用

错误消息:

 ValueError: ('Unknown string format: '2019W1')
预期产出:

ID     Date     Volume 
1    2019-01      9
1    2020-02     11
2    2019-01     39
2    2020-02     23
让我们就这么做吧

df.Date.str.replace('W','-')
0    2019-1
1    2020-2
2    2019-1
3    2020-2
Name: Date, dtype: object

也许你可以试试这个自定义代码

def custom_date(x):
    year = str(x)[:4]
    dict_month = {"W1":"01","W2":'02',"W3":'03',"W4":'04'}
    return year+"-"+dict_month.get(f"{str(x)[4:]}","NA")

df['Date']=df.Date.apply(lambda x:custom_date(x))

因此,我们的主要任务是将
YYYYWN
YYYYWN
转换为
YYYY-NN
。其中,
YYYY
W
字符串
,我们必须
替换它,
NN
周数

有两种替换方案。其解决方案的详细方案如下所述:-

# Import all-important Libraries
import pandas as pd

# Initialization of 'Data'
data = {
    'ID': ['1', '1', '2', '2', '3', '3'],
    'Date': ['2019W1', '2020W2', '2019W1', '2020W2', '2020W11', '2020W52'],
    'Volume': ['9', '11', '39', '23', '34', '53']
}

# Conversion of 'Data' to 'DataFrame'
df = pd.DataFrame(data)

# Conversion of 'YYYYWN' to 'YYYYWW' Using 'Regex'

# Replacement Logic if your 'week No.' is of Single Digit. i.e.:- 'WN'
df['Date'] = df['Date'].replace(r"W(\d)$", "-" + r"0\1", regex = True)

# Replacement Logic if your 'week No.' is of Multiple Digit. i.e.:- 'WNN'
df['Date'] = df['Date'].replace(r"W", "-" + r"", regex = True)

# Print Records
df
1。一周一位数
WN
格式(例如:-2019W1):-

因此,要用
YYYY-NN
替换
YYYYWN
,我们必须用
RegEx
使用
replace
函数

WN
标识的
RegEx
将是
W(\d)$
,其中:-

  • W
    是我们必须替换的
    字符“W”
  • (\d)
    用于识别
    单个数字
  • $
    用于查找
    结尾
    例如:-在我们的例子中是,
    (\d)$
    。因此,它将发现我们的
    模式
    是否以一位数结尾
WN
替换
RegEx
将为
0\1
,其中:-

  • 0
    :-在周数之前追加
    0
  • \1
    :-对于
    0
2。一周多位数
WNN
格式(例如:-2020W11):-

WNN
标识的
RegEx
将是
W
,其中:-

  • W
    是我们必须替换的
    字符“W”
WNN
替换
RegEx
将是

  • 因为我们只需要从
    日期开始
    修剪
    W
注意:-
我已获取了
虚拟数据
,用于
测试
目的
为了获得所需的
输出
,必须以适当的
顺序运行这两种方案

code
对于相同的场景,如下所述:-

# Import all-important Libraries
import pandas as pd

# Initialization of 'Data'
data = {
    'ID': ['1', '1', '2', '2', '3', '3'],
    'Date': ['2019W1', '2020W2', '2019W1', '2020W2', '2020W11', '2020W52'],
    'Volume': ['9', '11', '39', '23', '34', '53']
}

# Conversion of 'Data' to 'DataFrame'
df = pd.DataFrame(data)

# Conversion of 'YYYYWN' to 'YYYYWW' Using 'Regex'

# Replacement Logic if your 'week No.' is of Single Digit. i.e.:- 'WN'
df['Date'] = df['Date'].replace(r"W(\d)$", "-" + r"0\1", regex = True)

# Replacement Logic if your 'week No.' is of Multiple Digit. i.e.:- 'WNN'
df['Date'] = df['Date'].replace(r"W", "-" + r"", regex = True)

# Print Records
df

“不太有效”——那么,您当前的输出与预期的输出有何不同?你好像忘了显示你想要的结果。它不太管用,因为我出错了;'未知字符串格式:“2019W1”是
df.Date.replace(r“W(\d+)$”,“-”+r“0\1”,regex=True)
正在工作?您能解释一下regex吗?还有替换值
r“0\1”
?我有一种感觉,当您的周数大于9时,这将不起作用。@MarkRansom,正要发表此评论。。每周一次是2020W11。。产量为2020年-011@tjjudge对不起,我不知道那种情况。我已经更新了
code
,并进行了适当的解释。如果它仍然抛出一些错误的结果,那么请告诉我。
$
不符合您所描述的。