@munanga

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

pythonでdatetimeをつかい日付を計算しようとしているがうまくいきません

制作物:TWITTER 自動投稿BOT
目標機能:エクセルファイルを読み込んで、1日1回同じ時間に自動投稿を行う。
問題点:当日の投稿は問題なくできるが、日付のコントロールがうまくいかないです。
today = datetime.date.today()でもってきた本日の日付で投稿内容を生成

forの最後で日付の差分、変数diffを+1

diff+todayに加算して次の日付を生成

次回の投稿予定日としてエクセルから読み込んだ内容分だけ投稿予約。

以上の流れで日付が11/6→11/7→11/8のように推移してほしいのですがうまく推移してくれません。おそらく、for文の中の変数の評価の仕様に私が明るくないために起きているミスだと思い一通り、関係ありそうなところを外に出したりforの中に入れたり、色々な組み合わせを試してみたのですが、printをするとすぐにカーネルがビジー状態になるパターンが多く挫折してしまいました。(jupyternotebookをアナコンダ環境で使用中)

なにかアイディアのある方、アドバイスよろしくお願いいたします。


import pandas as pd
import tweepy
import sched
import time
import datetime

#consumer_key
CK = "hogehoge"
#consumer_secret
CS = "hogehoge"
#access_token
AT = "hogehoge"
#access_token_secret
AS = "hogehoge"

exfile = r"hogehoge.xlsx"

def tweet(text):
    """ツイートする"""
    auth = tweepy.OAuthHandler(CK, CS)
    auth.set_access_token(AT, AS)
    api = tweepy.API(auth)
    api.update_status(text) 
    
def tweet_sched(post_date, tweet_text):
    """時間を指定する"""
    scheduler = sched.scheduler(time.time, time.sleep)
    run_at = int(time.mktime(post_date.utctimetuple()))
    scheduler.enterabs(run_at, 1, tweet, (tweet_text,))
    scheduler.run()
    
today = datetime.date.today()
diff = 0
post_hour = "2"
post_mins = "30"
td = datetime.timedelta(days=diff)
caled_date = today + td
str_date = caled_date.strftime('%Y,%m,%d')
str_date_time = str_date+","+post_hour+","+post_mins
post_date = datetime.datetime.strptime(str_date_time, '%Y,%m,%d,%H,%M')

df = pd.read_excel(exfile)
url = df['エクセル列名A'].tolist()
rev = df['エクセル列名B'].tolist()
video_length = len(url)

for urli,revi in zip(url,rev):
    content = urli+revi
    post_date = datetime.datetime.strptime(str_date_time, '%Y,%m,%d,%H,%M')
    tweet_text = content
    tweet_sched(post_date, tweet_text)
    diff +=1

0 likes

2Answer

forループの中に、更新した変数diffを使う処理がありませんよ。
変数diffを使う処理をループの中で実行する必要があります。

2Like

Comments

  1. @munanga

    Questioner

    ご指摘のdiffの処理を試してみましたがどうやらご指摘のdiffの問題の以外にも自前で作っている日付とツイート用の型があっていないかもしれないようです。
    ともあれアドバイスのおかげで1ステップ進みましたありがとうございました!

時間計算はunixtimeで行うと簡単です。ご参考に。
run_at = int(time.mktime...
にて unixtime(エポック秒 1970/1/1から秒で起算)に変換しているなら

run_at = run_at - (run_at % 60)
run_at = run_at - (run_at % 3600)
run_at = run_at + 86400

で翌日の00:00です。 (但しutc)
日付が11/6→11/7→11/8のように推移は + 86400 で簡単に出来ます。

尚、エクセルは1900/1/1から日で起算したシリアル日の実数型ですので、起算日と単位が異なり、直接演算、比較ができません。
 unixtime(エポック秒)に変換(約-70年x86400)して下さい。具体的な方法はサイト検索のこと。
暇人x in 居酒屋

1Like

Comments

  1. @munanga

    Questioner

    こういうアドバイスはありがたいです!最悪の場合代替策が必要だと思っていたのでもし日付で困ったときかこちらの案も検討してみます!明日は平日ですので深酔いしないよう気をつけてください!

Your answer might help someone💌