Python将变量日期传递给函数

时间:2016-10-04 14:47:16

标签: python function

您好:取得进展但仍在苦苦挣扎。我有以下json:

json =
{
  "emeter": {
    "get_daystat": {
      "day_list": [
        { "year": 2016, "month": 10, "day": 1, "energy": 0.651000 },
        { "year": 2016, "month": 10, "day": 2, "energy": 0.349000 },
        { "year": 2016, "month": 10, "day": 3, "energy": 0.481000 }
      ],
      "err_code": 0
    }
  }
}

我使用线性搜索通过此功能查找特定日期的能量值:

parsed_json = json.loads(json)

def get_energy_value_by_date(obj, year, month, day):   
    for value in obj['emeter']['get_daystat']['day_list']:
        if value['year'] == year and value['month'] == month and value['day'] == day:
            return value['energy']


energy = get_energy_value_by_date(parsed_json, 2016, 10, 2)

到目前为止一切顺利。接下来我需要做的是找到不同日子的能量值。例如今天(假设json有效):

import datetime
day_now = datetime.datetime.now().strftime("%d")
month_now = datetime.datetime.now().strftime("%m")
year_now = datetime.datetime.now().strftime("%Y")

parsed_json = json.loads(json)

def get_energy_value_by_date(obj, year, month, day):   
    for value in obj['emeter']['get_daystat']['day_list']:
        if value['year'] == year and value['month'] == month and value['day'] == day:
            return value['energy']


energy_today = get_energy_value_by_date(parsed_json, year_now, month_now, day_now)
print energy_today

当我运行此脚本时,它返回

None

我必须遗漏一些基本的东西。我需要的是能够为任何一年中的任何一天的任何一天提取能量值以进行进一步处理。

谢谢!

猴面包树

1 个答案:

答案 0 :(得分:2)

您的脚本存在一个简单问题:根据文档,strftime

  

返回表示日期的字符串,由显式格式字符串控制。

这里的关键字是“字符串”。请参阅以下内容:

>>> import datetime
>>> day_now = datetime.datetime.now().strftime("%d")
>>> day_now
'04'

这不等于JSON文件中当天的整数值:

>>> '04' == 4
False

因此,相等检查将始终失败,并返回None。一种方法是使用int将此值转换为整数。更好的方法是使用datetime对象的属性来获取整数值:

>>> datetime.datetime.now().year
2016
>>> datetime.datetime.now().month
10
>>> datetime.datetime.now().day
4

我还建议只将date对象传递给函数并在那里解压缩:它可以防止冗余并清除函数签名。您还应该使用date.today()而不是datetime.now()(因为时间不相关),然后在一次操作中进行比较。完整的功能可能是这样的:

def get_energy_value_by_date(obj, current_day):   
    for value in obj['emeter']['get_daystat']['day_list']:
        if current_day == datetime.date(value['year'], value['month'], value['day']):
            return value['energy']

current_day = datetime.date.today()
energy_today = get_energy_value_by_date(parsed_json, current_day)
print (energy_today)