我想从pandas数据帧中的数据中提取一个星期号。
日期格式为datetime64[ns]
我已将日期标准化以从中删除时间
df['Date'] = df['Date'].apply(pd.datetools.normalize_date)
所以数据帧列中的日期现在看起来像是2015-06-17
现在我想把它转换成一个星期的数字。
只需访问Series.dt.isocalendar((的周属性:
示例:
In [286]:
df['Date'].dt.isocalendar().week
Out[286]:
0 25
dtype: int64
In [287]:
df['Week_Number'] = df['Date'].dt.isocalendar().week
df
Out[287]:
Date Week_Number
0 2015-06-17 25
这里是使用strftime
的另一种可能性。CCD_ 2是一种很好的资源。
df['Week_Number'] = df['Date'].dt.strftime('%U')
'%U'
表示一年中的周数(星期日是一周的第一天(,用零填充的十进制数表示。新年中第一个星期日之前的所有日子都被视为在第0周。
如果你有多年的日期,我建议你创建一个年周组合
df['Year-Week'] = df['Date'].dt.strftime('%Y-%U')
Pandas具有.dayofyear
和.weekofyear
功能,可以直接应用于pandas.to_datetime(df['column_name'])
的输出,并将类型"Timestamp"作为输出。
import pandas as pd
df['formatted_date'] = pd.to_datetime(df['datetime'])
df['day_of_year'] = df.formatted_date.apply(lambda x: x.dayofyear)
df['week_of_year'] = df.formatted_date.apply(lambda x: x.weekofyear)
from datetime import date
df_date = pd.DataFrame([date.today()],columns = ['today'])
print(df_date)
#### Print Output ####
# today
#0 2019-09-07
df_date['weeknum'] = df_date.today.apply(lambda x:x.isocalendar()[1])
print(df_date)
#### Print Output ####
# today weeknum
#0 2019-09-07 36
更新到此答案
在我当前的python版本中(3.72021年5月(。语法df['Date'].dt.week
正在打印以下警告:FutureWarning: weekofyear and week have been deprecated, please use DatetimeIndex.isocalendar().week instead
使用DatetimeIndex的方法是:df['week_number'] = pd.DatetimeIndex(df.index).isocalendar().week
这里有一个小的演示它的使用返回一个系列
# Input
time_idx = pd.date_range('2022-01-01', periods=4, freq='H').tz_localize('UTC')
values = [9 , 8, 7, 6]
df1 = pd.DataFrame(data = values, index=time_idx, columns=['vals'])
# FutureWarning: weekofyear and week have been deprecated
df1['week_number'] = df1.index.week
# Using DatetimeIndex.isocalendar().week instead
df2 = pd.DataFrame(data = values, index=time_idx, columns=['vals'])
# Does not throws a warning
df2['week_number'] = pd.DatetimeIndex(df2.index).isocalendar().week
print(df2)
在熊猫的情况下:
import random
import pandas as pd
desired_length = 100
desired_frequency="20D" # XXXM: XXX months, "XXXD":XXX days, XXXMin: XXX minutes etc.
index = pd.date_range('2020-01-01', periods=desired_length, freq=desired_frequency)
data = [random.random() for _ in range(len(index))]
df = pd.DataFrame(data=data, index=index, columns=['DATA'])
df[df.index.isocalendar().keys()] = df.index.isocalendar()
isocalendar()
将周编号1分配给一年中包含星期四的第一个日历周:
https://docs.python.org/3/library/datetime.html#datetime.date.isocalendar
strftime('%U')
和strftime('%W')
将周编号1分别分配给一年中包含周日和周一的第一个日历周:
https://docs.python.org/3/library/datetime.html#strftime-和字符串格式代码
如果Excel函数WEEKNUM(..., return_type=1)
的返回值是所需的输出,请使用strftime('%U').astype(int) + 1
:
https://support.microsoft.com/en-us/office/weeknum-function-e5c43a03-b4ab-426c-b411-b18c13c75340
===========
idx_dt = pd.date_range('2021-12-31', periods=7, freq='D')
df = pd.DataFrame(
{
'Weekday (str)': idx_dt.strftime('%Y-%m-%d (%a)'),
'Weeknum (isocalendar)': idx_dt.isocalendar().week,
'Weeknum (%U)': idx_dt.strftime('%U').astype(int),
'Weeknum (Excel)': [53, 1, 2, 2, 2, 2, 2],
},
index=idx_dt)
Weekday (str) Weeknum (isocalendar) Weeknum (%U) Weeknum (Excel)
2021-12-31 (Fri) 52 52 53
2022-01-01 (Sat) 52 0 1
2022-01-02 (Sun) 52 1 2
2022-01-03 (Mon) 1 1 2
2022-01-04 (Tue) 1 1 2
2022-01-05 (Wed) 1 1 2
2022-01-06 (Thu) 1 1 2