【发布时间】:2015-09-19 18:56:52
【问题描述】:
我想从 pandas 数据框中的数据中提取周数。
日期格式为 datetime64[ns]
我已将日期标准化以从中删除时间
df['Date'] = df['Date'].apply(pd.datetools.normalize_date)
所以日期现在看起来像 - 2015-06-17 在数据框列中
现在我想将其转换为周数。
提前致谢
【问题讨论】:
标签: python-3.x pandas datetime
我想从 pandas 数据框中的数据中提取周数。
日期格式为 datetime64[ns]
我已将日期标准化以从中删除时间
df['Date'] = df['Date'].apply(pd.datetools.normalize_date)
所以日期现在看起来像 - 2015-06-17 在数据框列中
现在我想将其转换为周数。
提前致谢
【问题讨论】:
标签: python-3.x pandas datetime
只需访问dt week 属性:
In [286]:
df['Date'].dt.week
Out[286]:
0 25
dtype: int64
In [287]:
df['Week_Number'] = df['Date'].dt.week
df
Out[287]:
Date Week_Number
0 2015-06-17 25
【讨论】:
Timestamp 对象的 week 属性是一年中的 ISO (8601) 周:github.com/pandas-dev/pandas/blob/…
这是使用strftime 的另一种可能性。 strftime.org 是一个很好的资源。
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.7,2021 年 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()
【讨论】: