日期时间与时间戳之间的周数差异

我有一个很大的问题,datetime并timestamp与我的工作DataFrame。我想确定一个日期的周数,但我发现了一些不一致的地方。这里的情况:


df = pd.DataFrame(['2018-12-28', '2018-12-29', '2018-12-30', '2018-12-31', 

                    '2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04'], 

                   columns=['datestr'])

df.date = pd.to_datetime(ddf.datestr, format='%Y-%m-%d')

df['week'] = ddf.date.apply(lambda x: x.week)

df['m'] = ddf.date.apply(lambda x: (x.year, x.week))

df['weekpy'] = ddf.m.apply(lambda d: datetime.strptime(str(d)+'-1', "(%Y, %W)-%w"))

给我


    datestr    week    m          weekpy

0   2018-12-28  52  (2018, 52)  2018-12-24

1   2018-12-29  52  (2018, 52)  2018-12-24

2   2018-12-30  52  (2018, 52)  2018-12-24

3   2018-12-31  1   (2018, 1)   2018-01-01

4   2019-01-01  1   (2019, 1)   2019-01-07

5   2019-01-02  1   (2019, 1)   2019-01-07

6   2019-01-03  1   (2019, 1)   2019-01-07

7   2019-01-04  1   (2019, 1)   2019-01-07

正如你所看到的,日期2018-12-31 为timestamp是在今年(星期一)2019年的第一个星期,但仍是2018年。此外,对于datetime2019年第一周的第一天是2019-01-07。


我们该如何处理?这样做的目标是按周分组


月关宝盒
浏览 268回答 3
3回答

慕莱坞森

鉴于.week跨两个不同日历年的那几周如何设置属性,我们需要一个与新年无关的分组函数。最简单的解决方案是假设您的数据中没有跳跃(您每天都有一行)并将其划分为 7 个块。但这感觉真的很脆弱。相反,这里有一个实现会询问“本周的星期一是什么时候?” 和小组。df.date.apply(lambda t: t - (t.dayofweek * pd.Timedelta('1 day')))这是有效的,因为datetime给定周星期一的确切值在每周之间都是唯一的。这是一个演示。这当然假设您希望 2018 年 12 月 31 日与 2019 年 1 月 1 日在同一周(可以说,这是因为它属于同一周一至周日的切片,但正如 Idlehands 指出的那样,这是一个问题语义由您决定)。

弑天下

使用isocalendar()返回 atuple的(year, week, day):df['m'] = df['date'].apply(lambda x: x.isocalendar()[:2])  # only need the year and week# 0    (2018, 52)# 1    (2018, 52)# 2    (2018, 52)# 3     (2019, 1)# 4     (2019, 1)# 5     (2019, 1)# 6     (2019, 1)# 7     (2019, 1)要计算一周的开始,请减去dayofweek:df['weekpy'] = df['date'].apply(lambda x: x - pd.Timedelta(days=x.dayofweek))# 0   2018-12-24# 1   2018-12-24# 2   2018-12-24# 3   2018-12-31# 4   2018-12-31# 5   2018-12-31# 6   2018-12-31# 7   2018-12-31最终结果:         date  week           m     weekpy0  2018-12-28    52  (2018, 52) 2018-12-241  2018-12-29    52  (2018, 52) 2018-12-242  2018-12-30    52  (2018, 52) 2018-12-243  2018-12-31     1   (2019, 1) 2018-12-314  2019-01-01     1   (2019, 1) 2018-12-315  2019-01-02     1   (2019, 1) 2018-12-316  2019-01-03     1   (2019, 1) 2018-12-317  2019-01-04     1   (2019, 1) 2018-12-31
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python