以下用于获取周数和年份的代码有效:
import pandas as pd
df = pd.DataFrame(data=pd.date_range('2021-11-29', freq='w', periods=10), columns=['date'])
df['weekNo'] = df['date'].dt.isocalendar().week
df['year'] = df['date'].dt.year
date weekNo year
0 2021-12-05 48 2021
1 2021-12-12 49 2021
2 2021-12-19 50 2021
3 2021-12-26 51 2021
4 2022-01-02 52 2022
5 2022-01-09 1 2022
6 2022-01-16 2 2022
7 2022-01-23 3 2022
8 2022-01-30 4 2022
9 2022-02-06 5 2022
但是,
df['weekYear'] = "%d/%d" % (df['date'].dt.isocalendar().week, df['date'].dt.year)
给出错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_26440/999845293.py in <module>
----> 1 df['weekYear'] = "%d/%d" % (df['date'].dt.isocalendar().week, df['date'].dt.year)
TypeError: %d format: a number is required, not Series
我正在以访问一系列值的方式访问周和年,如第一个代码片段所示。为什么当我想要格式化字符串时它不起作用?如何重写片段 2 中的代码,使其工作?我不想制作中间专栏。
最佳答案
- 为什么当我需要格式化字符串时它不起作用?错误很明显,因为
'%d'
需要一个十进制值,而不是pandas.Series
- 如果要提取的值有 format code,则可以使用
dt.strftime
。- 这要求
'date'
列是一个datetime dtype
,这可以用pd.to_datetime
来完成。以下示例中的列已经是正确的dtype
。 '%V'
:ISO 8601 周为十进制数,星期一为一周的第一天。第 01 周是包含 1 月 4 日的那一周。'%Y'
: 以十进制表示的年份。
- 这要求
import pandas as pd
# sample data
df = pd.DataFrame(data=pd.date_range('2021-11-29', freq='w', periods=10), columns=['date'])
# add week number and year
df['weekYear'] = df.date.dt.strftime('%V/%Y')
# display(df)
date weekYear
0 2021-12-05 48/2021
1 2021-12-12 49/2021
2 2021-12-19 50/2021
3 2021-12-26 51/2021
4 2022-01-02 52/2022
5 2022-01-09 01/2022
6 2022-01-16 02/2022
7 2022-01-23 03/2022
8 2022-01-30 04/2022
9 2022-02-06 05/2022
1M 行的计时
df = pd.DataFrame(data=pd.date_range('2021-11-29', freq='h', periods=1000000), columns=['date'])
%%timeit
df.date.dt.strftime('%V/%Y')
[out]: 3.74 s ± 19.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
关于python - 如何从 Pandas 日期时间列中提取组件并分配它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70149515/