python - 如何从 Pandas 日期时间列中提取组件并分配它们

标签 python pandas datetime

以下用于获取周数和年份的代码有效:

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/

相关文章:

matlab - MATLAB 中的多种日期格式

python - Django - 为测试目的填充数据库

python - 将字段标签传递给 WTForms __init__

python - Seaborn Plot 包括相同数据的不同分布

python - 如何从 pandas DataFrame 中绘制 timedelta 数据?

python - 如何在多个文件上运行Python脚本

python - 日期时间格式转换

python - pickle UnicodeDecodeError

python - 由于一个或多个映射器初始化失败,无法在 SQLAlchemy 中创建记录

javascript - 如何将非标准日期和时间文本放入 XDate 对象中?