python - 考虑到去年的第一天,今年的第一周

标签 python pandas datetime

我有以下 df:

time_series                  date   sales
store_0090_item_85261507     1/2020   1,0
store_0090_item_85261501     2/2020   0,0
store_0090_item_85261500     3/2020   6,0

“日期”=周/年。 因此,我尝试使用以下代码:

df['date'] = df['date'].apply(lambda x: datetime.strptime(x + '/0', "%U/%Y/%w"))

但是,返回这个 df:

time_series                  date        sales
store_0090_item_85261507     2020-01-05   1,0
store_0090_item_85261501     2020-01-12   0,0
store_0090_item_85261500     2020-01-19   6,0

但是,2020 年第一周的第一天是 2019-12-29,以星期日为第一天。我怎样才能得到2020年第一周的第一天2020-12-29而不是2020-01-05?

最佳答案

来自日期时间模块的文档:

%U: 一年中的周数(星期日为一周的第一天),采用零填充的十进制数。新年第一个星期日之前的所有日子都被视为在第 0 周。

编辑:我的原始答案不适用于输入1/2023,并且使用ISO 8601日期值不适用于< strong>1/2021,因此我通过添加自定义函数来编辑此答案

这是一种使用自定义函数的方法

import pandas as pd
from datetime import datetime, timedelta
##############################################
# to demonstrate issues with certain dates
print(datetime.strptime('0/2020/0', "%U/%Y/%w")) # 2019-12-29 00:00:00
print(datetime.strptime('1/2020/0', "%U/%Y/%w")) # 2020-01-05 00:00:00

print(datetime.strptime('0/2021/0', "%U/%Y/%w")) # 2020-12-27 00:00:00
print(datetime.strptime('1/2021/0', "%U/%Y/%w")) # 2021-01-03 00:00:00

print(datetime.strptime('0/2023/0', "%U/%Y/%w")) # 2023-01-01 00:00:00
print(datetime.strptime('1/2023/0', "%U/%Y/%w")) # 2023-01-01 00:00:00
#################################################

df = pd.DataFrame({'date':["1/2020", "2/2020", "3/2020", "1/2021", "2/2021", "1/2023", "2/2023"]})
print(df)

def get_first_day(date):
    date0 = datetime.strptime('0/' + date.split('/')[1] + '/0', "%U/%Y/%w")
    date1 = datetime.strptime('1/' + date.split('/')[1] + '/0', "%U/%Y/%w")
    date = datetime.strptime(date + '/0', "%U/%Y/%w")
    return date if date0 == date1 else date - timedelta(weeks=1)

df['new_date'] = df['date'].apply(lambda x:get_first_day(x))
print(df)

输入

     date
0  1/2020
1  2/2020
2  3/2020
3  1/2021
4  2/2021
5  1/2023
6  2/2023

输出

     date   new_date
0  1/2020 2019-12-29
1  2/2020 2020-01-05
2  3/2020 2020-01-12
3  1/2021 2020-12-27
4  2/2021 2021-01-03
5  1/2023 2023-01-01
6  2/2023 2023-01-08

关于python - 考虑到去年的第一天,今年的第一周,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67790726/

相关文章:

python - 更改 Pandas 箱线图的颜色

python - 插值仍然离开 NaN 的(pandas groupby)

python - 为什么 datetime.now() 和 datetime.utcnow() 返回不同的时间戳

java - 在 JSR-310 中计算修改后的儒略日

python - 客户端使用 python 套接字接收两条单独的消息

python - 按行将文件拆分成许多不同的文件 - 用原始文件的索引命名每个文件

python - 使用 python 子进程和 ssh 读取远程文件?

python - 使用 bottle.py 为静态文件设置 cookie

python - 如何在 Pandas 中选择(切片)多行和多个非连续列?

javascript - 在 JavaScript 中将 RFC 1123 日期格式转换为正常日期时间