iT邦幫忙

0

Dataframe 時間資料篩選

小弟我在篩選Dataframe中的資料困擾住了,想請問一下各位大神,以下是我的code以及資料:
code:

def search_time_FranklinWc(o):
  conn = pymysql.connect(**db_settings)
  command = f"""
  SELECT * FROM Franklin_topic_word_cloud where DATEDIFF(NOW(), start_date) < 14
  """
  df = pd.read_sql(command, conn)
  df['start_date'] = df['start_date'].apply(str)
  df['end_date'] = df['end_date'].apply(str)
  df['start_week'] = df['start_date'].apply(lambda x :datetime.datetime.strptime(x, "%Y/%m/%d").isocalendar()[1])
  df['end_week'] = df['end_date'].apply(lambda x :datetime.datetime.strptime(x, "%Y/%m/%d").isocalendar()[1])
  if o == "week":    
    result = df[df['start_week']!=df['end_week']]
  elif o == "day":    
    result = df[df['start_week']==df['end_week']]
  return result

資料:
https://ithelp.ithome.com.tw/upload/images/20210909/20141403xFBNB9wgOb.png
我希望能只抓end_date為2021/9/7的資料,所以我將code改為以下:

def search_time_FranklinWc(o):
  conn = pymysql.connect(**db_settings)
  command = f"""
  SELECT * FROM Franklin_topic_word_cloud where DATEDIFF(NOW(), start_date) < 14
  """
  today = datetime.date.today()
  target_day =  str(today- datetime.timedelta(days=2))
  df = pd.read_sql(command, conn)
  df['start_date'] = df['start_date'].apply(str)
  df['end_date'] = df['end_date'].apply(str)
  df['start_week'] = df['start_date'].apply(lambda x :datetime.datetime.strptime(x, "%Y/%m/%d").isocalendar()[1])
  df['end_week'] = df['end_date'].apply(lambda x :datetime.datetime.strptime(x, "%Y/%m/%d").isocalendar()[1])
  if o == "week":    
    target = df[df['start_week']!=df['end_week']]
    result = df[df['end_date']=target_day]
  elif o == "day":    
    result = df[df['start_week']==df['end_week']]
  return result

但它未如期完成,後來我發現可能是因為target_day='2021-9-7',所以並未匹配到。
我該如何正確處理時間格式,或是有沒有更好的篩選方式,請求各位大神解答qqq

  • end_date為str格式
obarisk iT邦研究生 2 級 ‧ 2021-09-10 09:32:45 檢舉
大概有幾種方向吧.
1. 直接改 sql 查詢把日期 format 成字串變成新的欄位
2. 直接改 sql 把查詢條件改成想查的條件
3. 在 python 把 target day 改成 datetime, 直接用 datetime 比對
4. 把 datetime 都轉成 "%Y%m%d" 再比對. (target_day 要轉, 查詢出來的欄位也要轉).
obarisk iT邦研究生 2 級 ‧ 2021-09-10 09:35:58 檢舉
轉字串

```python
import datetime
datetime.datetime.strftime(datetime.datetime.now(), "%Y%m%d")
```
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
丹尼派森
iT邦新手 5 級 ‧ 2021-09-10 00:26:06

我的話可能會先把他轉成同一個格式再來處理
不過會有點笨..
就一個一個看有什麼格式再慢慢加上去
依你現況我會寫成類似下面這樣

import datetime

dat1 = '2021-9-7'
dat2 = '2021-08-31'
format = "%Y-%M-%d"
format2 = "%Y/%M/%d"

def get_same_dat_string(date_string):
    dat = None
    try:
        dat = datetime.datetime.strptime(date_string, format2)#預設是%Y/%M/%d
    except ValueError:
        try:
            dat = datetime.datetime.strptime(date_string, format).strftime(format2)#是%Y-%M-%d轉回預設
        except ValueError:
            print(date_string)#超乎預期的格式就印出來
    return dat
print(get_same_dat_string(dat1))
print(get_same_dat_string(dat2))

我要發表回答

立即登入回答