如何将 object 转换为日期时间中的周数
How do I convert an object to a week number in datetime
我是 Python 的初学者,我正在尝试将当前代表周数的列名称更改为更容易理解的名称。我想更改它们以显示一周的开始日期,但我在转换类型时遇到问题。
我有一个 table 看起来类似于以下内容:
import pandas as pd
data = [[0,'John',1,2,3]
df = pd.dataframe(data, columns = ['Index','Owner','32.0','33.0','34.0']
print(df)
我尝试使用 df.melt
获取包含周数的列,然后将它们转换为日期时间并获取从那开始的周,但我没有成功。
df = df.melt(id_vars=['Owner'])
df['variable'] = pd.to_datetime(df['variable'], format = %U)
这是我所能得到的,因为我无法获得周数作为日期时间类型,然后用它来开始一周。
在此之后,我打算将数据框转换回其原始形状,并将新获得的周开始日期时间再次作为列 headers。
谁能告诉我我做错了什么,或者有更好的方法吗?
如有任何帮助,我们将不胜感激!
将周数转换为日期的一种解决方案是使用 timedelta。例如你可能有
from datetime import timedelta, datetime
week_number = 5
first_monday_of_the_year = datetime(2021, 1, 3)
week_date = first_monday_of_the_year + timedelta(weeks=week_number)
首先将 Index
列添加到 melt
,仅用于 variable
中的 week
值,然后转换为浮点数、整数和字符串,因此可能按周匹配:
data = [[0,'John',1,2,3]]
df = pd.DataFrame(data, columns = ['Index','Owner','32.0','33.0','34.0'])
print(df)
Index Owner 32.0 33.0 34.0
0 0 John 1 2 3
df = df.melt(id_vars=['Index','Owner'])
s = df['variable'].astype(float).astype(int).astype(str) + '-0-2021'
print (s)
0 32-0-2021
1 33-0-2021
2 34-0-2021
Name: variable, dtype: object
#
df['variable'] = pd.to_datetime(s, format = '%W-%w-%Y')
print (df)
Index Owner variable value
0 0 John 2021-08-15 1
1 0 John 2021-08-22 2
2 0 John 2021-08-29 3
编辑:
要获取原始 DataFrame(数周的整数列),请使用 DataFrame.pivot
:
df1 = (df.pivot(index=['Index','Owner'], columns='variable', values='value')
.rename_axis(None, axis=1))
df1.columns = df1.columns.strftime('%W')
df1 = df1.reset_index()
print (df1)
Index Owner 32 33 34
0 0 John 1 2 3
我是 Python 的初学者,我正在尝试将当前代表周数的列名称更改为更容易理解的名称。我想更改它们以显示一周的开始日期,但我在转换类型时遇到问题。
我有一个 table 看起来类似于以下内容:
import pandas as pd
data = [[0,'John',1,2,3]
df = pd.dataframe(data, columns = ['Index','Owner','32.0','33.0','34.0']
print(df)
我尝试使用 df.melt
获取包含周数的列,然后将它们转换为日期时间并获取从那开始的周,但我没有成功。
df = df.melt(id_vars=['Owner'])
df['variable'] = pd.to_datetime(df['variable'], format = %U)
这是我所能得到的,因为我无法获得周数作为日期时间类型,然后用它来开始一周。
在此之后,我打算将数据框转换回其原始形状,并将新获得的周开始日期时间再次作为列 headers。
谁能告诉我我做错了什么,或者有更好的方法吗?
如有任何帮助,我们将不胜感激!
将周数转换为日期的一种解决方案是使用 timedelta。例如你可能有
from datetime import timedelta, datetime
week_number = 5
first_monday_of_the_year = datetime(2021, 1, 3)
week_date = first_monday_of_the_year + timedelta(weeks=week_number)
首先将 Index
列添加到 melt
,仅用于 variable
中的 week
值,然后转换为浮点数、整数和字符串,因此可能按周匹配:
data = [[0,'John',1,2,3]]
df = pd.DataFrame(data, columns = ['Index','Owner','32.0','33.0','34.0'])
print(df)
Index Owner 32.0 33.0 34.0
0 0 John 1 2 3
df = df.melt(id_vars=['Index','Owner'])
s = df['variable'].astype(float).astype(int).astype(str) + '-0-2021'
print (s)
0 32-0-2021
1 33-0-2021
2 34-0-2021
Name: variable, dtype: object
#
df['variable'] = pd.to_datetime(s, format = '%W-%w-%Y')
print (df)
Index Owner variable value
0 0 John 2021-08-15 1
1 0 John 2021-08-22 2
2 0 John 2021-08-29 3
编辑:
要获取原始 DataFrame(数周的整数列),请使用 DataFrame.pivot
:
df1 = (df.pivot(index=['Index','Owner'], columns='variable', values='value')
.rename_axis(None, axis=1))
df1.columns = df1.columns.strftime('%W')
df1 = df1.reset_index()
print (df1)
Index Owner 32 33 34
0 0 John 1 2 3