Python 我怎样才能创建一个新的专栏;“一周”;进入熊猫的数据帧?

Python 我怎样才能创建一个新的专栏;“一周”;进入熊猫的数据帧?,python,pandas,dataframe,Python,Pandas,Dataframe,我的代码如下: my_dict = { "Date": pd.date_range('2020', freq='D', periods=100), "Open": np.random.randn(100), "High": np.random.randn(100), "Low": np.random.randn(100), "Close": np.rando

我的代码如下:

my_dict = {
    "Date": pd.date_range('2020', freq='D', periods=100),
    "Open": np.random.randn(100),
    "High": np.random.randn(100),
    "Low": np.random.randn(100),
    "Close": np.random.randn(100),
    "Volume": np.random.randn(100),
}

df = pd.DataFrame(my_dict)
display(df)
如何添加“周”列和“2020-01”、“2020-02”等值

“2020-01”是指2020年的第一周

import pandas as pd
import numpy as np
my_dict = {
    "Date": pd.date_range('2020', freq='D', periods=100),
    "Open": np.random.randn(100),
    "High": np.random.randn(100),
    "Low": np.random.randn(100),
    "Close": np.random.randn(100),
    "Volume": np.random.randn(100),
}

df = pd.DataFrame(my_dict)
df["Week"]="2020-01"
display(df)

如果希望每行中的值不同,可以创建for循环

使用dt year属性获取年份,并与week属性连接。zfill用于填充前导零

(df['Date'].dt.year.astype(str)
     .str.cat(df['Date'].dt.week.astype(str).str.zfill(2),
              sep='-'))

    0     2020-01
    1     2020-01
    2     2020-01
    3     2020-01
    4     2020-01
           ...   
    95    2020-14
    96    2020-15
    97    2020-15
    98    2020-15
    99    2020-15
这样做:

In [2233]: df['Week'] = df.Date.dt.year.astype(str) + '-' + df.Date.dt.week.astype(str).map(lambda x: f'{x:0>2}')

In [2234]: df.Week
Out[2234]: 
0     2020-01
1     2020-01
2     2020-01
3     2020-01
4     2020-01
       ...   
95    2020-14
96    2020-15
97    2020-15
98    2020-15
99    2020-15
Name: Week, Length: 100, dtype: object

您还可以执行以下操作:

df["Week"] = 1
df["Week"] = pd.to_datetime(df['Date']).dt.to_period('M')

dt.to_period取M/Y/D值分别打印月份、年份和日期

使用
datetime
。我正在使用pandas
.apply()
lambda
函数来格式化周

由于“日期”列是由时间戳类对象组成的,
isocalendar()
函数返回一个元组
('year'、'week'、'day')
,该元组的格式符合您的需要

import datetime
df['Week']=df['Date'].apply(lambda x: "{0}-{1:02d}".format(*list(x.isocalendar())))
df.head(10)
输出:


我想增加真实的一周。比如2020-01、2020-02。。。2020-54“真实的一周”是什么意思?你的问题不清楚看看这篇文章;您好,我可以将您的函数用于随机日期吗?在您发布的示例中,日期列是datetime对象。因此,您可以直接使用dt并获得所需的数据。如果它不是日期时间对象,则必须转换为日期时间对象。此外,如果date列中不包含月份的日期,则无法获取weekHello,我可以将您的函数用于随机日期吗?是的,它也可以用于随机日期。我认为这不是预期的输出。OP需要的是一年的确切周数,而不是
年-月组合。
Date    Open    High    Low Close   Volume  Week
0   2020-01-01  -0.628361   -0.019378   0.167120    1.421006    -0.698276   2020-01
1   2020-01-02  -0.515597   0.467128    1.784242    0.358433    0.197478    2020-01
2   2020-01-03  0.781038    0.225310    -0.636053   -0.241801   0.777247    2020-01
3   2020-01-04  1.332335    0.687737    -0.531952   1.554296    -0.243784   2020-01
4   2020-01-05  0.457940    -1.488220   0.408476    -0.196996   -0.970725   2020-01
5   2020-01-06  1.660737    0.610343    -0.769449   -0.854537   -1.203444   2020-02
6   2020-01-07  -0.472873   0.276941    -0.266524   0.450023    1.260696    2020-02
7   2020-01-08  -0.851558   0.092650    0.207837    0.107786    -0.002486   2020-02
8   2020-01-09  0.967156    0.337234    -1.394543   -0.221563   1.231157    2020-02
9   2020-01-10  0.407043    -1.079271   -0.730196   -0.262280   0.367848    2020-02