为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

月关宝盒 2021-11-02 18:59:31
我有一个很大的问题,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          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   (2018, 1)   2018-01-014   2019-01-01  1   (2019, 1)   2019-01-075   2019-01-02  1   (2019, 1)   2019-01-076   2019-01-03  1   (2019, 1)   2019-01-077   2019-01-04  1   (2019, 1)   2019-01-07正如你所看到的,日期2018-12-31 为timestamp是在今年(星期一)2019年的第一个星期,但仍是2018年。此外,对于datetime2019年第一周的第一天是2019-01-07。我们该如何处理?这样做的目标是按周分组
查看完整描述

3 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

鉴于.week跨两个不同日历年的那几周如何设置属性,我们需要一个与新年无关的分组函数。最简单的解决方案是假设您的数据中没有跳跃(您每天都有一行)并将其划分为 7 个块。

但这感觉真的很脆弱。相反,这里有一个实现会询问“本周的星期一是什么时候?” 和小组。

df.date.apply(lambda t: t - (t.dayofweek * pd.Timedelta('1 day')))

这是有效的,因为datetime给定周星期一的确切值在每周之间都是唯一的。这是一个演示

这当然假设您希望 2018 年 12 月 31 日与 2019 年 1 月 1 日在同一周(可以说,这是因为它属于同一周一至周日的切片,但正如 Idlehands 指出的那样,这是一个问题语义由您决定)。


查看完整回答
反对 回复 2021-11-02
?
弑天下

TA贡献1818条经验 获得超8个赞

使用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     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   (2019, 1) 2018-12-31

4  2019-01-01     1   (2019, 1) 2018-12-31

5  2019-01-02     1   (2019, 1) 2018-12-31

6  2019-01-03     1   (2019, 1) 2018-12-31

7  2019-01-04     1   (2019, 1) 2018-12-31


查看完整回答
反对 回复 2021-11-02
  • 3 回答
  • 0 关注
  • 267 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信