当前位置: 首页 > 知识库问答 >
问题:

如何根据django模型/字典向datetime列添加周数?

司寇琨
2023-03-14
  • 有一个客户发票及其到期日的数据表。(由客户代码标识)
  • 需要根据客户代码添加周数
  • 创建
  • 模型以持久化要添加的客户和周的列表
class BpShift(models.Model):
    bp_name = models.CharField(max_length=50, default='')
    bp_code = models.CharField(max_length=15, primary_key=True, default='')
    weeks = models.IntegerField(default=0)
from .models import BpShift
# used in views later
def week_shift(self, df):
        df['DueDateRange'] = df['DueDate'] + datetime.timedelta(
            weeks=BpShift.objects.get(pk=df['BpCode']).weeks)

我意识到我对数据记录的理解有严重缺陷。df['a']和df['b']将返回序列。当然,timedelta不会像这样工作(weeks=bpshift.objects.get(PK=df['bpcode']).weeks)。

d = {'BpCode':['customer1','customer2'],'DueDate':['2020-05-30','2020-04-30']}
df = pd.DataFrame(data=d)

我使用这些方法是希望能够立即更改dataframe,而不是使用df.iterrows()。我最近一直在像瘟疫一样避免for循环,并怀疑这是否是“正确”的心态。有什么推荐的方法可以做到这一点吗?提前感谢您的指导!

共有1个答案

蒙光华
2023-03-14

这个问题Python&Pandas:series to timedelta将帮助您从series to timedelta。而且虽然

pandas.Series(
    BpShift.objects.filter(
        pk__in=df['BpCode'].tolist()
    ).values_list('weeks', flat=True)
)

将给出一系列整数,我怀疑顺序是否与df['bpcode']中相同。因为它依赖于django模型和数据库后端。

因此,您最好不显式地创建系列,而是包含pkweeks列的DataFrame,以便可以使用df.join。像这样的东西

pandas.DataFrame(
    BpShift.objects.filter(
        pk__in=df['BpCode'].tolist()
    ).values_list('pk', 'weeks'),
    columns=['BpCode', 'weeks'],
)
django_response = [('customer1', 1), ('customer2', '2')]

d = {'BpCode':['customer1','customer2'],'DueDate':['2020-05-30','2020-04-30']}
df = pd.DataFrame(data=d).set_index('BpCode').join(
    pd.DataFrame(django_response, columns=['BpCode', 'weeks']).set_index('BpCode')
)
df['DueDate'] = pd.to_datetime(df['DueDate'])
df['weeks'] = pd.to_numeric(df['weeks'])
df['new_duedate'] = df['DueDate'] + df['weeks'] * pd.Timedelta('1W')
print(df)
             DueDate  weeks new_duedate
BpCode                                 
customer1 2020-05-30      1  2020-06-06
customer2 2020-04-30      2  2020-05-14

NB左联接将为Django数据库中不存在的客户提供NaN和NaT。您可以通过将how='inner'传递给df.join来避免这些行,或者以任何方式处理它们。

 类似资料:
  • 本文向大家介绍通过数据库向Django模型添加字段的示例,包括了通过数据库向Django模型添加字段的示例的使用技巧和注意事项,需要的朋友参考一下 首先借用书本(book)的这个数据模型: 添加字段 当要向一个产品设置表(或者说是model)添加一个字段的时候,要使用的技巧是利用Django不关心表里是否包含model里所没有的列的特性。 策略就是现在数据库里加入字段,然后同步Django的模型以

  • 问题内容: 我想像这样向数据框添加列“ D”: 根据以下字典: 因此结果数据框显示为: 到目前为止,我尝试了该方法,但无法弄清楚它如何与Dictionary一起工作。 问题答案: 调用并传递字典,这将执行查找并返回该键的关联值:

  • 问题内容: 我需要在Django模型中存储一些数据。这些数据并不等于模型的所有实例。 最初,我考虑过将模型子类化,但是我试图保持应用程序的灵活性。如果使用子类,则每次需要新的对象时都需要创建一个整个类,这是不好的。我还将最终得到很多子类,仅用于存储一对额外的字段。 我真的觉得词典是最好的方法,但是Django文档中没有关于在Django模型中存储词典的内容(或者我找不到它)。 有什么线索吗? 问题

  • 问题内容: 我需要将字典保存在模型字段中。我怎么做? 例如,我有此代码: 我应该为“ bill_products =“写什么,以便从我的产品模型到此帐单保存一些随机产品? 这是账单的模型说明: 以及产品的型号说明: 如果还有什么我要补充的请发表评论。谢谢! 问题答案: 我刚刚发现了django-jsonfield软件包,该软件包 是可重用的Django字段,可让您在模型中存储经过验证的JSON。

  • 问题内容: 我有一个简单的模型,其中包括, 和领域。 在管理方面,可能在其他地方,我想显示为: 对我而言,执行此操作的逻辑位置是在模型中通过创建一个这样的计算字段: 最终,我认为我需要以字符串形式获取名称字段的值。我得到的错误是。字符串所需的值。我不知道这是什么意思。 一定有一种简单的方法可以做到这一点,我敢肯定我不是第一个想要这样做的人。 编辑:下面是我的代码修改为丹尼尔的答案。我得到的错误是:

  • 从实体映射时,我想向DTO/model对象添加一个派生列表。例如,我有一个名为Company的实体类,它有一个员工列表。我希望公司模型对象包含员工列表和经理员工列表。(这不是我真正的类名,但这是我正在尝试做的事情)。所以,我希望公司数据有一个员工列表和一个经理列表,其中经理是通过过滤员工列表而得到的员工子集。 我尝试使用映射表达式和默认方法。然而,我需要使用EmployeeMapper,而我似乎没