【问题标题】:Based on a condition, convert a week date to day on Pandas根据条件,在 Pandas 上将星期日期转换为日期
【发布时间】:2021-05-09 22:45:15
【问题描述】:

我有这个数据集,其中包含年、月、周和销售数字:

df = pd.DataFrame()
df['year'] = [2011,2011,2011,2012,2012,2012]
df['month'] = [12,12,12,1,1,1]
df['week'] = [51,52,53,1,2,3]
df['sales'] = [10000,12000,11000,5000,12000,11000]
df['date_ix'] = df['year'] * 1000 + (df['week']-1) * 10 + 1
df['date_week'] = pd.to_datetime(df['date_ix'], format='%Y%W%w')
df

    year    month   week    sales   date_ix date_week
0   2011    12      51      10000   2011501 2011-12-12
1   2011    12      52      12000   2011511 2011-12-19
2   2011    12      53      11000   2011521 2011-12-26
3   2012    1       1       5000    2012001 2011-12-26
4   2012    1       2       12000   2012011 2012-01-02
5   2012    1       3       11000   2012021 2012-01-09

现在date_week 是一周的开始日(星期一)。我想将 date_week 转换为一天,除了一年中的第一周,我想隔离这一天(在这种情况下是 2012-01-01,即星期日)。我已经尝试过了,但是出了点问题。

df['date_start'] = np.where((df['year']==2012) & (df['week']==1), \
                            pd.to_datetime(str(20120101), format='%Y%m%d'), \
                            pd.to_datetime(df['date_ix'], format='%Y%W%w'))

    year    month   week    sales   date_ix     date_week   date_start
0   2011    12      51      10000   2011501     2011-12-12  1323648000000000000
1   2011    12      52      12000   2011511     2011-12-19  1324252800000000000
2   2011    12      53      11000   2011521     2011-12-26  1324857600000000000
3   2012    1       1       5000    2012001     2011-12-26  2012-01-01 00:00:00
4   2012    1       2       12000   2012011     2012-01-02  1325462400000000000
5   2012    1       3       11000   2012021     2012-01-09  1326067200000000000

预期的结果应该是:

    year    month   week    sales   date_ix date_week   date_start
0   2011    12      51      10000   2011501 2011-12-12  2011-12-12
1   2011    12      52      12000   2011511 2011-12-19  2011-12-19
2   2011    12      53      11000   2011521 2011-12-26  2011-12-26
3   2012    1       1       5000    2012001 2011-12-26  2012-01-01
4   2012    1       2       12000   2012011 2012-01-02  2012-01-02
5   2012    1       3       11000   2012021 2012-01-09  2012-01-09

请,任何帮助将不胜感激。

【问题讨论】:

  • 试试,(df['year']==2012) & (df['week']==1) 过滤器
  • 我将更新我的问题,因为我得到了错误的结果。谢谢!

标签: python pandas


【解决方案1】:

df['year']==2012df['week']==1需要用括号括起来,因为==&的优先级。

df['date_start'] = np.where((df['year']==2012) & (df['week']==1), \
                            pd.to_datetime(str(20120101), format='%Y%m%d'), \
                            pd.to_datetime(df['date_ix'], format='%Y%W%w'))

然后将np.where中的pd.to_datetime(str(20120101), format='%Y%m%d')改成pd.to_datetime(df['year'], format='%Y')

df['date_start'] = np.where((df['year']==2012) & (df['week']==1), \
                            pd.to_datetime(df['year'], format='%Y'),
                            df['date_week'])
print(df)

   year  month  week  sales  date_ix  date_week date_start
0  2011     12    51  10000  2011501 2011-12-12 2011-12-12
1  2011     12    52  12000  2011511 2011-12-19 2011-12-19
2  2011     12    53  11000  2011521 2011-12-26 2011-12-26
3  2012      1     1   5000  2012001 2011-12-26 2012-01-01
4  2012      1     2  12000  2012011 2012-01-02 2012-01-02
5  2012      1     3  11000  2012021 2012-01-09 2012-01-09

【讨论】:

  • 你好@Ynjxsjmh,谢谢你,但我的问题中提到的 2012 年第 1 周的 date_start 应该是 2012-01-01。请问,你知道我在哪里做错了吗?谢谢。
  • 非常感谢您抽出宝贵时间回答@Ynjxsjmh,我不知道将一年转换为完整日期的技巧。希望你有一个美好的一天!
【解决方案2】:

这个呢?

df['date_start'] = pd.to_datetime(df.week.astype(str)+
                       df.year.astype(str).add('-1') ,format='%V%G-%u')

这将使date_start 作为感兴趣的一周的星期一的日期。 (请注意,您当前的 date_start 存在偏移,您可能需要添加 1 周的 tmimedelta 来弥补它。

【讨论】:

  • 感谢您的回答,但仅在 2012 年的第 1 周,它应该是 2021-01-01,而不是 2011-12-26。
  • 使用此代码,我得到 2012 年第 1 周的 2021-01-02,即当年第一个星期一的日期
猜你喜欢
  • 1970-01-01
  • 2022-01-27
  • 2017-06-05
  • 2011-01-29
  • 2015-08-02
  • 2014-01-11
  • 1970-01-01
  • 2020-01-23
  • 2022-11-30
相关资源
最近更新 更多