问题描述
我是一名在银行工作的设计师,我正在尝试创建一个Python脚本,该脚本将创建随机交易CSV(使用随机和日期时间来创建)。这样可以节省大量时间和脑力。
我可以生成多个交易的列表,每个交易都包含一个日期和金额,但是,我一直在努力计算余额。具体来说,这是因为我需要按日期对列表进行排序,然后进行余额计算,而且我不知道在进行日期排序后如何进行此操作。 (在以前的尝试中,我发现新的余额计算不会更新全局变量,而只会更新单个交易行余额。)
无论是否使用课堂/词典方法,我都迷失了方向,想要获得一些外部意见。任何帮助将不胜感激。
import random
from datetime import datetime,timedelta
ledger = [] #complete ledger (multiple transactions)
today = datetime.Now()
account_balance = 1500
def create_date():
''' Create date for transaction'''
date_step = random.randrange(1,11) # Set range of days
raw_date = today + timedelta(days=-date_step)
''' Format date to match app's format'''
date = raw_date.strftime('%w %b %y')
return date
def create_amount():
''' Create amount up to 10.00 '''
raw_number = round(random.uniform(0.10,10.0),2)
return raw_number
def create_ledger(x):
global ledger
for n in range(x):
transaction = create_date(),create_amount()
ledger.append(transaction)
date_sort = lambda item: item[0]
ledger.sort(key=date_sort,reverse=True)
print(ledger)
create_ledger(10)
解决方法
请勿按日期降序对其进行排序:
FILENAME REFFILE '<path_to_the_file>';
在总帐上运行一个for循环,并以此方式替换它
FILENAME REFFILE '<path_to_the_file>' encoding="latin1";
如果您确实希望日期按升序排序,请在生成此输出后对其重新排序。
示例输出:
https://example.com/path/some-slug-with-numbers-int ✅
example.com/path/some-slug-with-numbers-int/ ✅
example.com/path/some-slug-with-numbers-int/external/slug ❌ // ignore and don't capture
警告,您的整个过程只适合生成相对较小的玩具示例
preg_match('/example\.com\/path\/(.*?)(\/|$)(?!\w)/',$input,$match);
if (!empty($match)) {
$slug = $match[1];
// $slug == 'some-slug-with-numbers-int'
}
,因为它会可怕地扩展。
此外,每当您在处理与财务相关的软件时,您都应该诚实地使用def create_ledger(x):
global ledger
for n in range(x):
transaction = create_date(),create_amount()
ledger.append(transaction)
date_sort = lambda item: item[0]
ledger.sort(key=date_sort,reverse=False) #<- set reverse=False
print(ledger)
而不是for i in range(len(ledger)):
tup = ledger[i]
account_balance -= tup[1]
ledger[i] = (tup[0],tup[1],account_balance)
,因为浮点数可以累积serious rounding errors(请参见account_balance的最后几行怎么会有一些荒谬的长数字。
IIRC的标准做法是将所有内容乘以100并将其存储为[('1 Aug 20',1.72,1498.28),('2 Aug 20',1.54,1496.74),3.47,1493.27),4.46,1488.81),4.53,1484.28),('3 Aug 20',5.46,1478.82),5.93,1472.8899999999999),('4 Aug 20',0.96,1471.9299999999998),('5 Aug 20',4.72,1467.2099999999998),('6 Aug 20',2.51,1464.6999999999998)]
,因此,您将使用美分而不是所用货币的美元。