【问题标题】:Extract data from starting month and year to end month and year not working python pandas从开始月份和年份到结束月份和年份的数据不工作python pandas
【发布时间】:2020-01-02 11:31:19
【问题描述】:

df

df = pd.DataFrame(np.random.random((2000,3)))
df['order_date'] = pd.date_range(start='1/1/2010', 
periods=len(df), freq='D')
df

输出(df):

      0             1            2      order_date
0   0.365432    0.305522    0.669302    2010-01-01
1   0.765919    0.093161    0.193244    2010-01-02
2   0.077184    0.039374    0.403210    2010-01-03
3   0.457787    0.188893    0.510776    2010-01-04
4   0.662214    0.003371    0.703892    2010-01-05
... ... ... ... ...
1995    0.709885    0.390519    0.888361    2015-06-19
1996    0.498479    0.719614    0.836749    2015-06-20
1997    0.808569    0.123956    0.050519    2015-06-21
1998    0.258573    0.663157    0.471312    2015-06-22
1999    0.018572    0.708157    0.931464    2015-06-23

用于提取 2010 年至 2015 年所有月份数据的代码

    for y in range(2010,2015):
        for x in range(1,13):
           df2 = df[((df['order_date']).dt.strftime('%m') == x)& 
           ((df['order_date']).dt.strftime('%Y')== y)]
        print('Data for period',x, y,'is\n',df2)
    year=year+1

获得的输出:

    Data for period 1 2010 is
 Empty DataFrame
Columns: [0, 1, 2, order_date]
Index: []
Data for period 2 2010 is
 Empty DataFrame
Columns: [0, 1, 2, order_date]
Index: []
...............
Data for period 12 2010 is
 Empty DataFrame
Columns: [0, 1, 2, order_date]
Index: []
Data for period 1 2011 is
 Empty DataFrame
Columns: [0, 1, 2, order_date]
Index: []
..............
Data for period 12 2011 is
 Empty DataFrame
Columns: [0, 1, 2, order_date]
Index: []
and so on

预期输出:

我想提取日期和年份数据框。但是我得到了空的数据框。请帮帮我。

【问题讨论】:

  • 与 df 相同。拼写错误

标签: python pandas date datetime


【解决方案1】:

按月或年比较Series.dt.monthSeries.dt.year

for y in range(2010,2015):
    for x in range(1,13):
       df2 = df[(df['order_date'].dt.month == x)&(df['order_date'].dt.year== y)]
    print('Data for period',x, y,'is\n',df2)

或者通过str将标量转为字符串:

for y in range(2010,2015):
    for x in range(1,13):
       df2 = df[((df['order_date']).dt.strftime('%m') == str(x))& 
       ((df['order_date']).dt.strftime('%Y')== str(y))]
    print('Data for period',x, y,'is\n',df2)

【讨论】:

  • @ShailajaGuptaKapoor - 是的,缺少一个),解决方案是df2 = df[(df['order_date'].dt.month == x)&(df['order_date'].dt.year== y)]
【解决方案2】:

将循环更改为

for y in range(2010, 2015):
    for x in range(1, 13):
        df2 = df[df["order_date"].dt.month.eq(x) & df["order_date"].dt.year.eq(y)]
    print("Data for period", x, y, "is\n", df2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    相关资源
    最近更新 更多